湾曲した設定を使用した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.phplocation \.php$SCRIPT_FILENAMESCRIPT_FILENAMESCRIPT_FILENAMEに等しくなります/scripts/1px.gif/test.php

さらに、 cgi.fix_pathinfo == 1 (デフォルト)の場合、 SCRIPT_FILENAME/scripts/1px.gifに等しくなり、 PATH_INFOtest.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ファイルへのアクセスが閉じられます。

Source: https://habr.com/ru/post/J100961/


All Articles