Information Security
PHP
5 May 2012

Уязвимость PHP в режиме CGI

Original author: php.net
Translation
Существует уязвимость на некоторых настройках основанных на CGI (на Apache + mod_php и Nginx + PHP-FPM не влияет), которая оставалась не замеченной, по крайней мере 8 лет. В 7 разделе спецификации CGI говорится:
Некоторые системы поддерживают метод для передачи [sic] массив строк в CGI скрипт. Используется только в случае «индексных» запросов. Определяется «GET» или «HEAD» HTTP-запрос со строкой поиска URL не содержащей незакодированных "=" символов.

Итак, запросы, которые не содержат знак "=" обрабатываются иначе для некоторых CGI реализаций. Для PHP это означает, что запрос, который содержит ?-s, может слить PHP исходный код страницы, но с запросом ?-s&=1 всё нормально.

Большое количество сайтов запускают PHP или как модуль Apache через mod_php, или с помощью PHP-FPM под Nginx. Ни один из этих способов не уязвим к этому. Прямая работа с CGI тоже не подвержена этой уязвимости.

Если вы используете Apache mod_cgi для запуска PHP, то вы можете быть уязвимы. Чтобы в этом убедиться надо добавить в конец в любого URL ?-s. Если вы видите исходный код, то вы уязвимы. Если открывается ваш сайт, то всё, скорее всего, в порядке.

Чтобы это исправить, обновитесь до PHP 5.3.12 или PHP 5.4.2.

Мы признаем, что с CGI является достаточно устаревшим способом запуска PHP, и может быть невозможным обновить сайты до последней версии PHP. В качестве альтернативы можно настроить веб-сервер, чтобы не допустить такого рода запросы, которые начинаются с "-" и не содержат "=". Добавление этого правила никак не должно повлиять на работу сайта. Для Apache, которые используют mod_rewrite, будет выглядеть следующим образом:

RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]


Если пишите свои правила, то не забудьте учесть и urlencoded ?%2ds версию.

Плохая неделя стала ещё хуже. У нас был баг в нашем багтрекере, который переключил приватный флаг отчёта об ошибке на публичный в комментарии к сообщению об ошибке, что сделало эту проблему публичной до того, как мы протестировали решения до нужного нам уровня. Пожалуйста сообщайте о всех проблемах через bugs.php.net.

Для того, чтобы скачать PHP 5.3.12 или PHP 5.4.2 посетите страницу загрузок. Бинарники для Windows доступны по адресу windows.php.net/download/. Существует лог изменений.

+37
10.2k 86
Comments 22
Top of the day