web-dev-qa-db-ja.com

nginxはjpg拡張子のファイルをphpファイルとしてどのように実行できますか?

Phpとして画像ファイルを実行することについて この答え についてフォローアップの質問があります。その答えは、nginxが仮想ディレクトリをサポートしていることを説明しています。走れる

www.something.com/blan.php/one/two/3

およびone/two/3は仮想サブディレクトリになります。次に、回答によれば、malicious.jpgという名前のファイルがある場合、nginxをだまして次のようなphpファイルとして実行できます。

localhost/malicious.jpg/something.php

これはどのようにして可能ですか?設定ミスか人為ミスか?

4
pax

これは厳密にはNginxの問題ではなく、古いバージョンのPHPの問題です。これはかなり長い間修正されています(どのバージョンかは正確にはわかりませんが、PHP 7.0)では問題ではありません)。この質問に対する答え:

https://serverfault.com/q/627903/377662

根本的な問題と解決策を詳しく説明してください。短い答えは、「仮想ディレクトリ」と呼ばれるものが多くのWebサーバーアプリケーション(ApacheやNginxを含む)で一般的であり、Webサイトが(/categories/5)ではなくNice url(別名categories.php?id=5)を表示できるようにするために使用されます。この流れを想像してください:

  1. ユーザー:サーバー、/categories/5をください
  2. サーバー(それ自体):うーん... /categories/5はファイルではありません
  3. サーバー(それ自体):それは大丈夫です、このルールはcategories.phpが何をすべきか知っていると言います
  4. サーバー:PHP、ユーザーが/categories/5を要求し、categories.phpがそれを処理できる必要があります。何を返せばいいのか教えてもらえますか?
  5. PHP:わかりました。私はcategories.phpと話しました。これがあなたの答えです!
  6. サーバー:ユーザー、/categories/5の内容は次のとおりです

これは一般的にかなり簡単な交換です。サーバーはすべてを適切に実行しました-PHP実行するファイルの名前だけでなく、最初にリクエストされたURLの詳細も知る必要があります。

残念ながら古いバージョンのPHPは混乱を招くために使用され、サーバーからcategories.phpが実行するものであると言われたにもかかわらず、サーバーからの情報を「修正」しようとすることがあり、終了する場合がありますサーバーが実際に提案したものとは異なるファイルを実行します。これにより、元のURLがtest.jpgであるという事実に基づいて、PHPがtest.jpg/whatever.phpを実行します。完全に異なるファイル。

これはもはや関連する問題ではないはずです。もし心配なら、php.iniファイルでfix_pathinfoディレクティブを0に設定するだけです。繰り返しになりますが、完全な詳細と背景は この質問 の回答で広く説明されています。

3
Conor Mancone

問題は、ほとんどの場合、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の実行を制限することです。

1
LvB