この変更自体を「重要」とは言いませんが、それでもセキュリティに影響があります。そのアドバイスが適切になってから根本的に変更されたものは何も知りません.PHPの動作は、セキュリティに影響がある場合でも、後方互換性に強く向かう傾向があります。 upload
という名前のディレクトリなど、サーバーにファイルをアップロードできるサーバーがあるとします。 .ここで、アップロード スクリプトは、特定の拡張子を持つファイルのみを許可するように注意します (たとえば、.png
のみとします)。 ) 誰も悪意のある PHP ファイルをアップロードしないようにします。
ここで、攻撃者として、ファイルに evil.png
という名前の PHP シェルを書き込もうとします。 、アップロードします。アップロードしたら http://example.com/upload/evil.png
にアクセスします 、しかし、これはファイルをダウンロードするだけであることがわかります-ファイル名が.png
で終わるため、nginxはphp-fcgiにリクエストを送信してphpとして処理することはありませんでした .
もし私が PATH_INFO
を知っている攻撃者なら 、次は http://example.com/upload/evil.png/index.php
を試してみます .サーバーがそのように構成されている場合、これにより PHP が実行されます (nginx が index.php
を見るため) PHP は、ディレクトリではなくファイルであるコンポーネントが見つかるまでパスをたどります (evil.png
)、それを実行しようとします。その後、私のシェルが実行され、私が勝ちます。
そうは言っても、事前に NGINX 構成でパスを分割することでこれに対処するより良い方法があるため、PHP はファイルシステムを歩いていません。
この問題に関する Neal Poole の優れたブログ投稿から:
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
# Zero-day exploit defense.
# http://forum.nginx.org/read.php?2,88845,page=3
# Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
# Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine. And then cross your fingers that you won't get hacked.
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php;
}
今でも、見つかったファイルの最初の出現から PHP がスクリプトを処理しているため、危険を伴うようです。では、なぜ彼らはデフォルトを ;cgi.fix_pathinfo=1
のままにしたのですか?
CGI は PHP から独立しており、独自の標準を持っているためです。 CGI (Common Gateway Interface) は、アプリケーションとのデータ通信方法、リクエスト情報とボディの受け渡し方法、入力から出力までをサーバーに指示するインターフェースです。 Web のサーバーは、CGI
としてプログラムを実行するように構成できます。 、つまり、要求データを特定のプログラムに転送します。これが、NGinx がリクエストを PHP に渡す方法です。
CGI 標準といえば 、 PHP-FPM
PHP-FPM
に記載されているように、開発者は CGI 標準に準拠する必要があります。 ini ファイルの例:/etc/php/7.2/fpm/php.ini
:
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
だから私はテキスト Setting this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting of zero causes PHP to behave as before.
を仮定します 選択を説明します。これが PATH_INFO
です CGI仕様