Summary
Announced: 2010-05-20
Credits: 80sec
Affects: сайты на ngnix+php с возможностью загрузки файлов в директории с fastcgi_pass
Background
Зачастую How-To по настройке связки 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;
}
Problem Description
Однако если попросить у сервера отдать example.com/1px.gif/test.php, то URI примет вид
1px.gif/test.php
, что подойдёт под location \.php$
, а SCRIPT_FILENAME
станет равным /scripts/1px.gif/test.php
.Далее, если
cgi.fix_pathinfo == 1
(по дефолту), то SCRIPT_FILENAME
станет равным /scripts/1px.gif
, а PATH_INFO
будет равен test.php
NB! В некоторых конфигурациях уязвимость триггерит URL вида
1px.gif%00test.php
В итоге php интерпретатор обработает
/scripts/1px.gif
. То есть,Impact
Любой пользователь будет иметь возможность заливать файлы на сервер (например, аватары) то создав особенное изображение, которое будет одновременно проходить валидацию размеров GD и исполняться php интерпретатором, будет иметь права на исполнение произвольного кода на сервере с правами php процесса.
Workaround
Через в
php.ini
cgi.fix_pathinfo=0
или же через конфиг nginx.conf
location ~ \.php$ {
try_files $fastcgi_script_name =404;
fastcgi_index index.php;
fastcgi_param script_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
это фактически закроет доступ ко всем не существующим файлам
.php