среда, 31 октября 2012 г.

Баг PHP CGI

Критическая уязвимость PHP выполняемого в режиме CGI


На днях ко мне обратился один знакомый с просьбой посмотреть на то, что происходит у него на сайте. А точнее, как раз таки на сайте у него и ничего не происходило, т. е. полный штиль.

А интуиция мне подсказывала, что это может быть затишье перед бурей)
Я послал команду пинг на сервер, и она вернула мне (правильный ответ:)

Команда же traceroute захлебнулась на последнем прыжке, продолжая анализировать, не сосем адекватное поведение веб сервера, я решил обратиться к утилите w3m.

w3m это Текстовый веб-браузер под Linux, который позволяет посмотреть заголовки ответа веб сервера. Все остальные коды ответа веб сервера можно посмотреть на моем сайте.

w3m имеет четыре значения параметра:
-dump_source дамп кода страницы;
-dump_head дамп ответа на HEAD;
-dump_both дамп HEAD и кода страницы;
-dump_extra дамп HEADа, кода, и дополнительной информации:)

 Это пример работы утилиты w3m (точнее удачного возвращения кода ответа сервера:) типа 200 ОК
[kroot@myhost ~]# w3m -dump_head http://soft-deev.blogspot.ru/

HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Expires: Wed, 31 Oct 2012 06:16:58 GMT
Date: Wed, 31 Oct 2012 06:16:58 GMT
X-XSS-Protection: 1; mode=block
Content-Length: 0
Server: GSE


В моем же случае код овета получился:

w3m: Can't load нес_частный_сайт.рф    
Потом я начал смотреть логи сервера. А увидел я там следующее:

"POST /?-dsafe_mode%3DOff+-ddisable_functions%3DNULL+-dallow_url_fopen%3DOn+-dallow_url_include%3DOn+-dregister_globals%3DOn+-dauto_prepend_file%3Dphp://input HTTP/1.0" 200  
А потом:
"POST //injectcode.php HTTP/1.0"

В общем говоря простым языком был произведен  url_include. 

Мне удалось подключиться к серверу по SSH, и я даже не удивился когда на сайте обнаружил шелл.
CMS сайта была достаточно популярна, и в ответ на уязвимость этой_CMS гугл мне не выдал ничего утешительного. Потом я отправил другой запрос и попал в точку.

Кратко:
Существует критическая уязвимость в PHP, которая позволяет запустить произвольный код на сервере (с помощью вышеопианного инклуда) или [просто] просмотреть исходный код любого PHP-документа, выполняемого в CGI-режиме.

Не многим) позже я выяснил, что даже существует эсплоит позволяющий полностью автоматизировать задачу взломщику.

В заключении: я удалил шелл, и кое, что еще)(и поставил заплатку в .htaccess

<ifmodule mod_rewrite.c="mod_rewrite.c">
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]
</ifmodule>


После чего сайт заработал, и мы оба облегченно выдухнули().

А Ваш хостер случайно не использует mod_cgi для запуска PHP?

Это можно узнать если в строке url к документу.пхп, например site/index.php добавить параметр ?-s

Пример: Ваш_сайт/?-s

Причем данная уязвимость существует еще на некоторых серверах.
 
Вот такая забавная история приключилась со мной в тот хмурый вечер.)

P.S. Кстати данный эксплоит нагружает файл .htaccess инструкциями, которые вообще блокируют доступ к сайту, и он остается в автономном владении только злоумышленника.

Поэтому данное поведение свойственно только новичку, а умный backdoor фиксит уязвимость в .htaccess и не палится:)

        Ну а если Вас интересует другой функционал файла локальной конфигурации Web сервера Apache .htaccess, то вы можете посмотреть на пример создания ЧПУ на PHP сайте с помощью .htaccess в моей блоге на WordPress. Там все подробно расписано! =)

13 комментариев:

  1. Вот попробовал сделать как вы описали - не получилось - сразу загрузилась страница. Может что не так сделал?

    ОтветитьУдалить
    Ответы
    1. Дмитрий не волнуйтесь, у Вас все работает нормально, точнее подключен ПХП как надо))

      Удалить
  2. Изучаю php с недавнего времени. Много чего уже понял в php и сейчас уже тестирую свои программы на денвере. Делаю успехи, но пока мне изучать предстоит очень многое в php. Вот я не понял CGI и суть его работы. Какое отношение имеет CGI к php? Объясните мне, пожалуйста. В интернете не нашел более подробного ответа. Спасибо.

    ОтветитьУдалить
    Ответы
    1. Существует несколько способов подключения PHP к веб-серверу. Чаще всего это происходит с помощью модуля mod_php, который позволяет PHP и веб серверу взаимодействовать друг с другом в рамках одного процесса.
      Но есть и другой способ, который осуществляется посредством CGI (Common Gateway Interface). Он для подключения ПХП к серверу использует модуль mod_cgi.
      Сам же CGI — это порядком устаревший интерфейс, используемый для связи внешней программы с веб-сервером, причем даже совершенно не важно на каком языке она написана будь то PHP или Perl (абсолютно не важно).
      В режиме CGI для каждого запроса веб-сервер запускает отдельный процесс.
      И только если используется mod_cgi для запуска PHP, то сервер можно считать уязвимым) И такие еще есть на просторах инета)

      Удалить
    2. Если правильно вас понял, использование mod_cgi для запуска PHP, сервер становится уязвимым. А зачем тогда использует CGI. Может было лучше, если использовали только mod_php.

      Удалить
    3. Для создания веб-приложений (сайтов, блогов, порталов) используются различные языки веб программирования.
      Скрипты, написанные на этих языках, выполняются не центральным процессором сервера, а программой-интерпретатором.
      Модуль mod_cgi может запускаться веб-сервером как отдельный процесс и общаться с ним через интерфейс CGI.
      В данном случае при каждом запросе клиента сервер запускает отдельный процесс интерпретатора. После обработки запроса процесс завершается и полностью удаляется из памяти.
      К недостаткам такого подхода – можно отнести очень большую ресурсо=емкость.
      К преимуществам же можно отнести то, что -- происходит изоляция процессов (интерпретатор выполняется отдельно от сервера и не может нарушить его работу:)
      Говоря простым языком хостеры таким образом обеспечивают безопасность своих серверов.

      Удалить
  3. Дмитрий, как хорошо, что Вы в этих багаг разбираетесь. У меня самый главный баг, - в голове. Есть ли какая кнопка от этого? Клацнул, - и голова на место стала. Нужен хакер.

    Завидую я Вам белой завистью. В этих иероглифах попробуй разберись. Похоже на китайскую грамматику средневековья.

    ОтветитьУдалить
    Ответы
    1. Да если бы такая кнопка была дети бы у нас все генниями были тогда :)

      Удалить
  4. Да! "Чайнику" это непонятно! Жаль!

    ОтветитьУдалить
    Ответы
    1. Если есть желание этому научиться и есть желание научиться этому, то можно научиться. Например, когда я начинал и это было недавно (после того как пришел в кук-ку.ру), я не понимал даже html, а сейчас уже изучаю php и делаю успехи и все это благодаря кук-ку и Master-It.

      Удалить
  5. Я постепенно начинаю понимать чт без пхп никуда. У меня опять отключили на хостинге из-за нагрузки на процессор поэтому прийдется большую часть плагинов переписывать руками для того чтобы сат работал. Да можно перейти на другого хостера - но вот внутреннее нежелание что то менять.

    ОтветитьУдалить
  6. Пора мне учить PHP,чем и займусь в ближайшие сроки!!Надо заботится о безопасности своего сайта)

    ОтветитьУдалить
  7. Yοu in reality a good webmaster. The site loading pace is incredible. It sort of feels that you are doing any unique trick. In addition, The contents are masterpiece. you've performed a wonderful tаѕk in thіs topіc!

    ОтветитьУдалить