apacheの「パース脆弱性」という言葉を何度も耳にしましたが、ちょうど今日、ある方から質問がありましたので、この「パース脆弱性」とは何かを簡単に説明します。
まずはテストのプロセスと結果の比較から。
この結果
まず、apacheのバージョン2.xをインストールし、apacheとphpをモジュールとして結合させ、テストしたところ、このような解析の脆弱性が存在することがわかりました。
成果2
そこで、apacheとphpの結合方法をfastcgi方式に変更し、テストしてみたところ、500エラーのバーストは、そのような解析の脆弱性はありませんでした。
エラーのヒント
1Bad file descriptor: mod_fcgid: 子プロセスの生成方法がわからない: f4ck.php.x
ファイルを解析する方法を知らないということです。
結果は、その後、この作品の範囲の影響については、apacheのすべての現在のバージョンでは、この問題を抱えているが、唯一のphp apacheを解析するモジュールの方法に適用され、php apacheを解析するfastcgiの方法を使用する影響を受けませんが、php apacheを解析するcgiの方法を使用するかどうか未テストの影響。
ここで、私がテスト中に発見したことを簡単にご紹介しましょう。
#
# DefaultType: the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value. If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#10DefaultType text/plainDefaultType は f4ck.xxx のような未知の拡張子を持つファイルの扱い方を apache に伝えるために存在します。拡張子は xxx で、これは通常のウェブページやスクリプトファイルではありません。
DefaultTypeのデフォルト値は "text/plain "です。つまり、拡張子が不明なファイルがあった場合、通常のtxtファイルやhtmlファイルとして扱います。
テスト1
例えば、以下のコードをf4ck.xxxとして保存しました:
1F4ckTeam apacheテスト
このファイルにアクセスすると、デフォルトのapacheコンフィギュレーションに従って、このファイルは特定の効果のためにブラウザによって表示されます:
これは、ファイルの内容がHTMLコードであり、ファイル内のHTMLコードがブラウザによって実行される、未知の拡張子を持つファイルのためのものです。
テスト2
つまり、拡張子が不明で中身がphpコードであるファイルについて、そのphpコードは解析されるのでしょうか?
検査結果を見に来てください:
ご覧のように、phpコードを含む未知の拡張子のファイルは、ここではtxtドキュメントとして扱われます。
しかし、ファイル名をf4ck.php.xxxに変更すると、モジュールとしてphpを実行するapacheによって解析されます。
Apache はファイルがファイル名を持っていなくても複数の拡張子を持っていると考えているので、解析方法の判定は右から左に始めるべきだと考えています。一番右の拡張子が認識できない場合は、ファイル名が判定されるまで左に進みます。
公式説明より抜粋:
エクステンション
一般的に、this はファイル名の最後のドットに続く部分です。 しかし、Apache は複数のファイル名の拡張子を認識します。拡張子を認識しますので、ファイル名に複数のドットがある場合は、 最初のドットに続くドットで区切られた部分が拡張子になります。 例えば例えば、file.html.en というファイル名は .html と .en という二つの拡張子を含んでいます。 Apache のディレクティブでは、拡張子は最初のドットの有無に関わらず指定できます。また、拡張子は大文字小文字を区別しません。
つまり、"test 1 "と "test 2 "では、apacheはこのファイルの拡張子が不明であることを発見すると、まず拡張子を調べます。"f4ck.xxxx"、拡張子 "xxxx "には他に認識できる拡張子はないので、apacheはhttpd.nfのパラメータpeの値に従って、ファイルをどのように扱うか、つまりxtドキュメントとして扱うかを決定します。そのため、apache は httpd.nf のパラメータ pe の値に従って、 つまり xt ドキュメントとして、ファイルをどのように扱うかを決定します。
同様に、"aの結果 "と "2の結果 "のために、また、徐々にファイルの解析方法の未知の拡張子を決定するような方法に従っている、最初のApacheは、ファイルの拡張子が不明であることが判明し、それが最初に拡張子かどうかを調べます。他の識別可能な拡張子があり、完全なファイル名の場合には "f4ck.php.x "であり、apacheは、未知の拡張子 "x "に認識可能な拡張子があることがわかった"php "である場合、apacheはそれをphpファイルであるとみなし、phpファイルをパースするのと同じようにファイルをパースします。
そういえば、apacheの拡張子の定義がconf/mime.typesファイルに書かれていることは重要です:
ファイル mime.types は apache が異なる拡張子のファイルをどのように扱うかを定義し、 ファイル httpd.nf のパラメータ pe の値は HE が未知の拡張子のファイルをどのように扱うかを定義します。
さらに、httpd.nf ファイル内のステートメントブロック "" を使用して、"pe" ステートメントを使用して異なる拡張子のファイルを解析する方法を定義することができます。
処理と解析は全く異なる概念です。apache + phpの組み合わせのウェブサイトのように、apacheはアプリケーションサーバ、phpはミドルウェアです。apacheはHTTPリクエストの受信/応答のみを担当し、hpは.hpファイルの解釈を担当します。MLコードはクライアントに送られます。
余談ですが、拡張子rarはmime.typesファイルには表示されませんので、rarファイルをアップロードできるapacheでphpとモジュラーの組み合わせがある場合は、"f4ck.php.rar "のようなファイルをアップロードしてのようなファイルをアップロードします。
ソリューション1
.hp.*としてフォーマットされたファイル名へのアクセスを無効にするには、httpdに以下のステートメントを追加します:
<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>
解答2
ファイル名を保持する必要がある場合は、アップロードされたファイル名の". "を"_"に置き換えることで、プログラムのソースコードを変更することができます。を"_"に置き換えてください:
$filename = str_replace('.', '_', $filename);ファイル名を保持する必要がない場合は、アップロードされたファイル名をタイムスタンプ+乱数形式にリネームするようにプログラムのソースコードを変更することができます。
要約:インターネットは、 "Apacheの低バージョンの未知の拡張子解決の脆弱性 "が間違っていると述べ、正しい文は、Apacheのすべてのバージョンのモジュールモードとphpの組み合わせの使用は、未知の拡張子解決の脆弱性であるべきであり、Apacheのすべてのバージョンのfastcigモードとphpの組み合わせの使用は、この脆弱性を持っていません。fastcig モードと php の組み合わせを使用するバージョンの apache には、この脆弱性はありません。また、この脆弱性を悪用するためには、ファイルの拡張子に ".php" が少なくとも一つ含まれていることを確認する必要があり、そうでない場合はデフォルトで txt/html ドキュメントとして扱われます。





