Выполнение произвольного кода на серверах с PHP CGI

Выполнение произвольного кода на серверах с PHP CGI

Накануне был обнаружен, пожалуй, самый эпичный баг в истории PHP. Уязвимость позволяет атакующему выполнить произвольный код, используя лишь адресную строку браузера, на любом сервере, где PHP работает как CGI. Нашла уязвимость голландская команда Eindbazen, известная по своим выступлениям на различных CTF. Хронология событий:



13.01 – в ходе Nullcon HackIM CTF Eindbazen случайно находят 0day-уязвимость в PHP;

17.01 – Eindbazen отправляют баг-репорт разработчикам PHP;

03.05 – тикет в багтрекере PHP по непонятным причинам становится общедоступным, сведения об уязвимости появляются на reddit.com;

03.05 – в блоге Eindbazen появляется пост с PoC для просмотра исходного кода PHP-скрипта

04.05 – публикуется патч , «закрывающий» уязвимость

04.05 – тут же обнаруживается, что патч можно обойти; выпускается патч для патча , причем разработчики PHP не пишут, что нужно скачать новый патч. Все, кто скачал уязвимый патч думают, что уязвимость закрыта.

04.05 – в Metasploit появляется Remote Code Execution эксплоит .


Больше всего удивляют действия разработчиков PHP. В течение трех месяцев с момента багрепорта они так и не разработали решения устранения уязвимости, продолжая при этом выпускать новые версии PHP. О тикете, случайно ставшим публичным, думаю, вообще говорить нечего. Финал этой драматичной истории с выпуском патча на патч не кажется таким уж и непредсказуемым.


Просмотр исходного кода


/index.php?-s

Выполнение произвольного кода из Metasploit


/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
POST: phpinfo();

Уязвимость распространяется на все сервера, где PHP работает как CGI-модуль; сервера с FastCGI не подвержены. Уязвимыми оказались целые хостинги, например мой хостер agava.ru. Вчера на любом их сайте, включая и здесь, можно было выполнить любой код и не только. Например, обращение по http://blog.agava.ru/wp-config.php?-s любезно предоставляло данные для подключения к базе данных:



Что делать?


Решить проблему может выпущенный патч, хотя вполне вероятно, что в будущем найдется обход и для него. На Suhosin patch также не стоит полагаться, так как для его обхода достаточно лишь указать параметр -n, и PHP-скрипт выполнится без учета директив в php.ini. Самый простой способ защититься – использовать .htaccess со следующими правилами:


RewriteEngine on
RewriteCond %{QUERY_STRING} ^[^=]*$
RewriteCond %{QUERY_STRING} %2d|- [NC]
RewriteRule .? - [F,L]

Уязвимости exploit php взлом
Alt text

Арсений Реутов

блог о web-безопасности