Pull to refresh

Уязвимость связки PHP+nginx с кривым конфигом

Reading time1 min
Views60K

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
Tags:
Hubs:
+129
Comments109

Articles