This is a basic tutorial on how to do a simple PHP injection, for all you n00bish script kiddies
UPDATE: FYI, since the release of php 5.2.1, this post mainly applies to earlier versions since remote includes will be disabled in all future releases unless specifically allowed in php.ini.
So basically, a PHP injection is a way of slipping your code in with someone else’s, while making the server think it is legit. Take a common php-formatted URL:
You need to understand what this URL is doing — basically, it is calling on the index.php page, but the ? lets the server know that there is a command string following, in this case a page specification of mypage.php. ? Acts as an include by pulling the contents of a specified file into index.php. There’s what my index.php file looks like:
<?php include ('header.php');
include($page) //this is the page we are calling in the URL ?>
Now, the index.php?page= syntax is the worse case scenario — it will allow you to include the contents of any page into index.php. Do you get where I’m going with this?
An easy example and test is to take your vulnerable page and append an extra URL to it, for example, google.com. So my URL will look like this:
If you see Google show up anywhere on the page, then congratulations, you found a leak in the code. Now, knowing that you can pull any file into the URL and have it posted in index.php, I’m sure your mind is wandering with possibilies. Why don’t we try the .htaccess?
Or if you’re feeling daring you could probably even grab the master passwd file on the server:
But don’t get your hopes on on that one… most servers use open base_dir protection with Apache to keep php from going where it shouldn’t go.
Now thank we know the basics, let’s have some fun!
Using something like Notepad, create a text file and save it as a cmd.jpg in ANSI coding, and upload it to your server:
<?php passthru($cmd); ?>
Now go back to the vulnerable page, but add your file’s URL to the end:
Now you can append commands the end of the URL to run Linux commands in the browser. Yes, Linux commands — meaning you now have free reign to the user’s directories, especially ones that are stupidly set to 666 or 777. You can pretty much do anything, like create files/folders, write scripts, download more files, and maybe even delete a few. Here’s the syntax:
*sigh* Now I have to tell you how to prevent this. In a nutshell:
1. Install mod_security into Apache and make sure your rulesets accomodate the php software you have installed, including access to sensitive files like .htaccess and .htpasswd. This means when those files are called in a browser the server will deny the request.
2. Turn register_globals of for php. It shouldn’t be on anyways.
3. You’ll probably want to add a file exists() function, which will make sure that any included files exist locally.
4. Turn off url Fopen in php.ini or .htaccess, but beware, because some software requires this to work.
UPDATE: Since php 5.2.1, remote includes are no longer enabled without the php.ini directive for allow_url_include. Read Post
5. Make sure you have open base_dir protection enabled in Apache so PHP can’t access files outside the user directory.
6. And the big DUH! Keep your software up to date and refrain from making any folders or files on your site writeable by the “everyone else” group without taking the proper measures to protect them.