PHPでは、 show_source()関数( highlight_file()としてエイリアス)を使用して、指定されたファイルのソースコードを構文ハイライト付きの形式で表示します。多くの場合、コードスニペットのデバッグまたは表示に使用されます。ただし、 show_source()が呼び出されたときに入力パスが厳密に検証されない場合、パストラバーサル攻撃がトリガーされ、機密ファイルが漏れ、深刻なセキュリティリスクを引き起こす可能性があります。
PATHトラバーサル攻撃とは、ファイルパスパラメーターを操作することによって開示されていないはずのサーバー上のファイルにアクセスする攻撃者を指します。攻撃者は通常、 .../に似たディレクトリジャンプシンボルを使用して、アクセス制限をバイパスし、システムに敏感なファイル( /ett/passwd 、構成ファイル、データベース接続情報など)を読み取り、情報の漏れを引き起こします。
サンプルコード:
<?php
if (isset($_GET['file'])) {
show_source($_GET['file']);
}
?>
$ _get ['file']の入力がフィルタリングされていない場合、攻撃者は以下を要求して任意のファイルにアクセスできます。
http://gitbox.net/script.php?file=../../../../etc/passwd
これにより、サーバーは/etc /passwdファイルのコンテンツを直接出力し、深刻な情報漏れを引き起こします。
限られたアクセスディレクトリ<br> プリセットディレクトリ内のファイルへのアクセスのみが許可されます。たとえば、As /var/www/html/sources/にアクセスできるファイルのディレクトリを定義し、任意のリクエストをそのディレクトリに記載する必要があります。
<?php
$baseDir = '/var/www/html/sources/';
if (isset($_GET['file'])) {
$file = basename($_GET['file']); // ファイル名のみが保持されます,ディレクトリの交差を避けてください
$path = realpath($baseDir . $file);
if ($path !== false && strpos($path, $baseDir) === 0 && is_file($path)) {
show_source($path);
} else {
echo "違法なファイルパス!";
}
}
?>
入力をフィルタリングして確認します
Basename()関数を使用して、パス内のディレクトリ情報を削除します。
RealPath()と組み合わせて、ファイルの実際のパスを確認して、ファイルが指定されたディレクトリにあることを確認します。
ファイルが存在し、通常のファイルであることを確認します。
ユーザーの直接着信パスを無効にします<br> ユーザーがファイルパスを直接渡すのではなく、事前定義されたファイルリストまたはIDマップテーブルを介して表示されるファイルを決定するのが最善です。
ハザード関数ディスプレイをオフにします<br> 生産環境では、ソースコード表示機能の公開を避けるか、許可されていないアクセスを防ぐために許可制限を設定しないようにしてください。
show_source()関数自体にはセキュリティの脆弱性がありませんが、入力パスが慎重に処理されない場合、パストラバーサル攻撃とリークサーバーに敏感な情報につながるのは簡単です。防止する鍵は、ユーザーが入力したパスを厳密に確認し、ファイルアクセススコープを制限し、渡されて実行されるパスを回避することです。上記の測定により、パストラバーサル攻撃を効果的に防止し、システムセキュリティを確保できます。