Уязвимость связки PHP+nginx при cgi.fix_pathinfo=1

Сайты на Nginx + PHP с возможностью загрузки файлов в директории с fastcgi_pass подвержены уязвимости при выставленной в конфиге PHP директиве cgi.fix_pathinfo=1.


Часто в руководствах по настройке сервера на базе связки nginx и php-fpm/php-cgi имеются подобные строчки:

location ~ \.php$ {    fastcgi_pass 127.0.0.1:9000;    fastcgi_index index.php;    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;    include fastcgi_params;}

Однако при такой настройке если попросить сервер отдать страницу по адресу example.com/1px.gif/test.php то URI примет вид 1px.gif/test.php что подойдет под location \.php$ а SCRIPT_FILENAME станет равным /scripts/1px.gif/test.php.

Таким образом если конфиг PHP имеет директиву cgi.fix_pathinfo=1 (а это чаще всего и встречается по умолчанию) то SCRIPT_FILENAME станет равным /scripts/1px.gif а PATH_INFO будет равен test.php.

NB! В некоторых конфигурациях уязвимость триггерит URL вида 1px.gif%00test.php.

В итоге php-интерпретатор обработает /scripts/1px.gif. То есть если любой пользователь будет иметь возможность заливать некие файлы на сервер (к примеру аватары) то создав особенное изображение которое будет одновременно исполняться php-интерпретатором и проходить валидацию размеров GD будет иметь права на исполнение произвольного кода на сервере с правами php-процесса.

Лечение:

Через в php.ini:

cgi.fix_pathinfo=0

и в конфиге nginx.conf:

location ~ \.php$ {       try_files $fastcgi_script_name =404;       fastcgi_indexindex.php;       fastcgi_paramscript_FILENAME /scripts$fastcgi_script_name;       includefastcgi_params;}

Данные директивы фактически закроют доступ ко всем несуществующим файлам .php чего собтвенно нам и нужно.


Оригинал статьи http://pingvinoff.net/2012/08/10/uyazvimost-php-nginx/

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

Оставить комментарий