この記事では、PHP に関する関連知識を提供します。主にファイル インクルージョンの脆弱性に関する問題を紹介します。ファイル インクルージョンの脆弱性の原因は、ファイルが PHP 関数を通じて導入される場合に発生します。受信ファイル名が変更されていないためです。正しく検証され、予期しないファイルが操作されています。これが皆さんのお役に立てれば幸いです。
## 推奨される調査: 「PHP ビデオ チュートリアル 」
次の 4 つの関数は通常、PHP にファイル インクルードの脆弱性を引き起こします。
1. include() を使用してファイルをインクルードする場合、ファイルはコードが include() 関数に対して実行された場合にのみインクルードされます。エラーが発生すると、警告のみが表示され、実行が続行されます。
2. include_once() の関数は include() と同じですが、同じファイルが繰り返し呼び出される場合、プログラムはそのファイルを 1 回だけ呼び出すという点が異なります。
3. require() はプログラム実行と同時にファイルを呼び出しますが、エラーが発生した場合はエラーメッセージを出力してスクリプトを終了します
4. require_once() にも同様の機能がありますrequire() と同じように、違いは次のとおりです。その理由は、同じファイルが繰り返し呼び出される場合、プログラムはそのファイルを 1 回だけ呼び出すためです。
同時に、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 を実行できます。
推奨学習: 「
PHP ビデオ チュートリアル以上がPHP ファイルインクルードの脆弱性の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。