Summary Announced: 2010-05-20 Credits: 80sec Affects: сайты на ngnix+php с возможностью загрузки файлов Background Во всех HowTo по настройке связки nginx с php-fpm / php-cgi есть похожие строчки: Code: 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 В итоге php интерпретатор обработает /scripts/1px.gif. То есть, Impact Любой пользователь будет иметь возможность заливать файлы на сервер (например, аватары) то создав особенное изображение, которое будет одновременно проходить валидацию размеров GD и исполняться php интерпретатором, будет иметь права на исполнение произвольного кода на сервере с правами php процесса. Workaround Дописываем в php.ini Code: cgi.fix_pathinfo=0 или же менее предпочитаемый, дописываем в nginx.conf Code: location ~ \.php$ { if ( -f $request_filename ) { fastcgi_pass unix:/tmp/php-fpm.sock; } fastcgi_index index.php; fastcgi_param script_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } это фактически закроет доступ ко всем файлам .php лежащим по пути содержащем точку и /.