動的インクルージョンは多くの状況で使用され、ディレクトリ名またはファイル名の一部が変数に保存されます。たとえば、動的ページの一部をキャッシュして、データベース サーバーの負荷を軽減できます。
りー
この脆弱性をより明確にするために、例では $_GET が使用されています。この脆弱性は、汚染されたデータを使用する場合にも存在します。 $_GET['username'] の使用は、問題がより明確にわかる極端な例です。
上記のフローには利点もありますが、攻撃者がページをキャッシュすることを自由に選択する機会も提供します。たとえば、ユーザーは URL のユーザー名の値を編集することで、他のユーザーのキャッシュ ファイルを簡単に表示できます。実際、攻撃者は、ユーザー名の値を対応するファイル名 (拡張子なし) に変更するだけで、/cache ディレクトリ内の .html 拡張子を持つすべてのファイルを表示できます。
http://www.php.cn/
このプログラムは攻撃者が操作できるディレクトリとファイル名を制限していますが、ファイル名の変更が唯一の方法というわけではありません。攻撃者は、ファイル システム全体に創造的にアクセスし、他のディレクトリにある .html ファイルを表示して機密情報を発見できます。これは、文字列内の親ディレクトリを使用してディレクトリ スパンを実行できるためです。 http://www.php.cn/
上記URLの実行結果は以下の通りです。 現時点では,... は、ルート ディレクトリである /cache の親ディレクトリを意味します。したがって、上記の例は次と同等です:
<?php include "/cache/{$_GET['username']}.html"; ?>
すべてのファイルはファイル システムのルート ディレクトリにあるため、このプロセスにより、攻撃者はサーバー上のすべての .html ファイルにアクセスできます。
一部のプラットフォームでは、攻撃者は NULL を使用して文字列を終了することもできます。例:
http://www.php.cn/
これにより、.html ファイル拡張子の制限が回避されます。
もちろん、攻撃者の悪意のある攻撃方法をすべて盲目的に推測することは不可能です。ファイルにどれだけ多くの制御を追加しても、リスクを排除することはできません。動的にインクルードする場合は、汚染されたデータを決して使用しないことが重要です。攻撃手段は静的ではありませんが、脆弱性は変わりません。この脆弱性は、データをフィルタリングするだけで修正できます (第 1 章を参照):
<?php include "/cache/../admin/users.html"; ?>
もう 1 つの効果的な方法は、パラメータにファイル名部分のみが含まれ、パス情報が含まれていないことを確認することです。 .basename( を使用する) )データをフィルタリングするには:
<?php include "/admin/users.html"; ?>
パス情報を許可しているが、検出前に単純化したい場合は、RealPath()関数を使用できます:
<?php $clean = array(); /* $_GET['filename'] is filtered and stored in $clean['filename']. */ include "/path/to/{$clean['filename']}"; ?>
上記のプログラムで取得した結果 ($filename) は、/path/to ディレクトリにあるかどうかを確認するために使用できます。
りー
検出に失敗した場合は、後の調査のために攻撃ログにリクエストを記録する必要があります。他のセキュリティ対策が失敗する理由を特定する必要があるため、このプロセスを多層防御対策として使用する場合、これは特に重要です。
上記は、PHP セキュリティ ファイル名操作の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。