湾曲した設定を使用した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