ホームページ >バックエンド開発 >PHPチュートリアル >PHP ファイルインクルードの脆弱性の詳細な分析

PHP ファイルインクルードの脆弱性の詳細な分析

WBOY
WBOY転載
2022-05-09 17:30:2410807ブラウズ

この記事では、PHP に関する関連知識を提供します。主にファイル インクルージョンの脆弱性に関する問題を紹介します。ファイル インクルージョンの脆弱性の原因は、ファイルが PHP 関数を通じて導入される場合に発生します。受信ファイル名が変更されていないためです。正しく検証され、予期しないファイルが操作されています。これが皆さんのお役に立てれば幸いです。

PHP ファイルインクルードの脆弱性の詳細な分析

## 推奨される調査: 「

PHP ビデオ チュートリアル

脆弱性の説明

ファイルこの脆弱性の理由は、PHP 関数を通じてファイルが導入されるときに、受信ファイル名が適切に検証されないため、予期しないファイルが操作され、予期しないファイルの漏洩や悪意のあるコードの挿入につながる可能性があることです。

次の 4 つの関数は通常、PHP にファイル インクルードの脆弱性を引き起こします。
1. include() を使用してファイルをインクルードする場合、ファイルはコードが include() 関数に対して実行された場合にのみインクルードされます。エラーが発生すると、警告のみが表示され、実行が続行されます。
2. include_once() の関数は include() と同じですが、同じファイルが繰り返し呼び出される場合、プログラムはそのファイルを 1 回だけ呼び出すという点が異なります。
3. require() はプログラム実行と同時にファイルを呼び出しますが、エラーが発生した場合はエラーメッセージを出力してスクリプトを終了します
4. require_once() にも同様の機能がありますrequire() と同じように、違いは次のとおりです。その理由は、同じファイルが繰り返し呼び出される場合、プログラムはそのファイルを 1 回だけ呼び出すためです。

脆弱性の危険

攻撃者はこの脆弱性を利用して、任意のファイルを読み取り、サーバー上の機密情報を取得する可能性があります。

脆弱性はバージョンに影響します

この脆弱性の存在はバージョンとは関係ありません

脆弱性分析

PHP が POST パケットを送信するとき、パケットにファイル ブロックが含まれている場合、アクセスするコードにファイルのアップロードを処理するロジックがあるかどうかに関係なく、PHP はファイルを一時ファイル (通常は /tmp/php[ 6 つのランダムな文字])、ファイル名は $_FILES 変数で見つかります。この一時ファイルはリクエストの完了後に削除されます。

同時に、phpinfo ページは現在のリクエスト コンテキスト内のすべての変数を出力するため、ファイル ブロックを含むデータ パケットを phpinfo ページに送信すると、リターンパケット 当然、一時ファイル名も含まれます。
ファイルインクルードの脆弱性によって悪用可能なファイルが見つからない場合、この方法を使用して一時ファイル名を見つけてそれをインクルードできます。
ただし、ファイル インクルードの脆弱性ページと phpinfo ページは通常 2 つのページであり、理論的には、最初にデータ パケットを phpinfo ページに送信し、次に戻りページからの一時ファイル名を照合してから、これを送信する必要があります。ファイルインクルード脆弱性ページにファイル名を追加し、getshell を実行します。最初のリクエストの終了時に一時ファイルは削除されるため、当然のことながら 2 番目のリクエストを含めることはできません。
このとき、条件付き競合を利用する必要があります。具体的な処理は次のとおりです。
1) Webシェルを含むアップロードデータパケットをphpinfoに送信します。このデータパケットのヘッダー、getなどの位置は、ジャンクデータが詰まっています。
2) phpinfo はこの時点ですべてのデータを出力しますが、ゴミデータにより phpinfo は非常に大きくなります。
3) PHP のデフォルトのバッファ サイズは 4096 です。つまり、PHP は毎回 4096 バイトをソケット接続に返します。
4) したがって、ネイティブソケットを直接操作して、毎回 4096 バイトを読み取りますが、読み取られた文字に一時ファイル名が含まれている限り、2 番目のデータパケットはすぐに送信されます。
5) この時点では、最初のデータパケットのソケット接続はまだ終了していませんが、PHP は毎回 4096 バイトを出力し続けるため、一時ファイルは削除されていません。
6) この時間差を利用して、一時ファイルを正常にインクルードし、最後に getshell を実行できます。

環境設定

    docker の起動:
  1. service start docker
  2. docker-compose.yml ファイルがあるパスで実行:
  3. docker-compose build
    docker-compose up -d

    PHP ファイルインクルードの脆弱性の詳細な分析
脆弱性の再発

    http://your-ip:8080/phpinfo にアクセスしてください.php を開くと、phpinfo ページ

  1. 2 がページに表示されることがわかります。次に http://your-ip:8080/lfi.php?file=/etc/passwd にアクセスすると、次のことがわかります。このページにはファイルが含まれる脆弱性があります。 PHP ファイルインクルードの脆弱性の詳細な分析
    POC 検証: PHP ファイルインクルードの脆弱性の詳細な分析 使用法: python3 PHP ファイルには vulnerability_poc.py --target-url http://192.168.60.244:8080

    PHP ファイルインクルードの脆弱性の詳細な分析
  2. ##修正提案

ホワイトリストを設定します。

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHP ファイルインクルードの脆弱性の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。