湾曲した設定を使用したPHP + nginxバンドルの脆弱性
まとめ
発表:2010-05-20
クレジット: 80sec
影響:fastcgi_passを使用してディレクトリにファイルをアップロードする機能を持つngnix + phpのサイト
背景
多くの場合、php-fpm / php-cgiでnginxバンドルを設定する方法は、次のような行になります。
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }
問題の説明
ただし、サーバーに
example.com/1px.gif/test.phpを要求すると、URIは
1px.gif/test.php
ように
1px.gif/test.php
、
location \.php$
に
SCRIPT_FILENAME
、
SCRIPT_FILENAME
は
SCRIPT_FILENAME
に等しくなります
/scripts/1px.gif/test.php
さらに、
cgi.fix_pathinfo == 1
(デフォルト)の場合、
SCRIPT_FILENAME
は
/scripts/1px.gif
に等しくなり、
PATH_INFO
は
test.php
等しくなり
test.php
NB! 一部の構成では、この脆弱性により、
1px.gif%00test.php
という形式のURLがトリガーされます。
その結果、PHPインタープリターは
/scripts/1px.gif
を処理し
/scripts/1px.gif
。 つまり、
インパクト
すべてのユーザーは、サーバー(たとえば、アバター)にファイルをアップロードできます。その後、GDサイズを検証し、PHPインタープリターによって実行される特別なイメージを作成して、PHPプロセス権限を持つサーバーで任意のコードを実行する権利があります。
回避策
php.ini
介し
php.ini
cgi.fix_pathinfo=0
またはnginx.conf configを介して
location ~ \.php$ { try_files $fastcgi_script_name =404; fastcgi_index index.php; fastcgi_param script_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }
これにより、実際には存在しないすべての
.php
ファイルへのアクセスが閉じられます。
All Articles