Уязвимость связки PHP+nginx

Discussion in 'Уязвимости' started by PandoraBox, 6 Aug 2010.

  1. PandoraBox

    PandoraBox Elder - Старейшина

    Joined:
    6 May 2007
    Messages:
    262
    Likes Received:
    176
    Reputations:
    7
    Summary

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

    [​IMG]

    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 лежащим по пути содержащем точку и /.
     
    4 people like this.