Уязвимость связки PHP+nginx
August 06, 2010 09:12AM
[b]Summary[/b]

Announced: 2010-05-20
Credits: 80sec
Affects: сайты на ngnix+php с возможностью загрузки файлов

[img]http://img814.imageshack.us/img814/3741/201008041344021680x1050.png[/img]

[b]Background[/b]

Во всех HowTo по настройке связки 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;
}

[b]Problem Description[/b]

Однако если попросить у сервера отдать 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. То есть,

[b]Impact[/b]

Любой пользователь будет иметь возможность заливать файлы на сервер (например, аватары) то создав особенное изображение, которое будет одновременно проходить валидацию размеров GD и исполняться php интерпретатором, будет иметь права на исполнение произвольного кода на сервере с правами php процесса.

[b]Workaround[/b]

Дописываем в php.ini

cgi.fix_pathinfo=0

или же менее предпочитаемый, дописываем в nginx.conf
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 лежащим по пути содержащем точку и /.

[hr]

http://habrahabr.ru/blogs/sysadm/100961/
Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 262
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready