Phpとして画像ファイルを実行することについて この答え についてフォローアップの質問があります。その答えは、nginxが仮想ディレクトリをサポートしていることを説明しています。走れる
www.something.com/blan.php/one/two/3
およびone/two/3
は仮想サブディレクトリになります。次に、回答によれば、malicious.jpg
という名前のファイルがある場合、nginxをだまして次のようなphpファイルとして実行できます。
localhost/malicious.jpg/something.php
これはどのようにして可能ですか?設定ミスか人為ミスか?
これは厳密にはNginxの問題ではなく、古いバージョンのPHPの問題です。これはかなり長い間修正されています(どのバージョンかは正確にはわかりませんが、PHP 7.0)では問題ではありません)。この質問に対する答え:
https://serverfault.com/q/627903/377662
根本的な問題と解決策を詳しく説明してください。短い答えは、「仮想ディレクトリ」と呼ばれるものが多くのWebサーバーアプリケーション(ApacheやNginxを含む)で一般的であり、Webサイトが(/categories/5
)ではなくNice url(別名categories.php?id=5
)を表示できるようにするために使用されます。この流れを想像してください:
/categories/5
をください/categories/5
はファイルではありませんcategories.php
が何をすべきか知っていると言います/categories/5
を要求し、categories.php
がそれを処理できる必要があります。何を返せばいいのか教えてもらえますか?categories.php
と話しました。これがあなたの答えです!/categories/5
の内容は次のとおりですこれは一般的にかなり簡単な交換です。サーバーはすべてを適切に実行しました-PHP実行するファイルの名前だけでなく、最初にリクエストされたURLの詳細も知る必要があります。
残念ながら古いバージョンのPHPは混乱を招くために使用され、サーバーからcategories.php
が実行するものであると言われたにもかかわらず、サーバーからの情報を「修正」しようとすることがあり、終了する場合がありますサーバーが実際に提案したものとは異なるファイルを実行します。これにより、元のURLがtest.jpg
であるという事実に基づいて、PHPがtest.jpg/whatever.php
を実行します。完全に異なるファイル。
これはもはや関連する問題ではないはずです。もし心配なら、php.iniファイルでfix_pathinfo
ディレクティブを0に設定するだけです。繰り返しになりますが、完全な詳細と背景は この質問 の回答で広く説明されています。
問題は、ほとんどの場合、PHPブロックを次のように構成することです。
location ~ '\.php' {
include fastcgi.conf;
include fastcgi_params;
fastcgi_param HTTP_PROXY "";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
fastcgi_intercept_errors on;
fastcgi_pass unix:/sockets/php.socket;
}
これは.php
で終わるすべてのURLパスに一致します。これは、オンラインの多くの(悪い)例と、このリスクを明確に説明していないnginxサンプル構成の以前のバージョンが原因で行われます。これを緩和する方法は、ユーザーがアップロードしたファイルを含むすべての場所からのphpの実行を制限することです。