1. ファイルシステムの階層構造 #filesystem
Linux サーバでは、ファイルは木構造のディレクトリに置かれます。ルートディレクトリ / から始まり、その下に etc、var、home 等のサブディレクトリがあります。
/
├── etc/
│ ├── passwd ← ユーザ一覧(歴史的にここ)
│ ├── shadow ← パスワードハッシュ
│ └── nginx/
│ └── nginx.conf
├── var/
│ ├── www/
│ │ └── utsuroi/ ← うつろい EC のソース
│ │ ├── public/
│ │ │ └── images/
│ │ └── config/
│ │ └── secrets.yml
│ └── log/
│ └── nginx/access.log
└── home/
└── ec_user/.ssh/id_rsa
2. 絶対パスと相対パス #absolute-relative
- 絶対パス — ルート
/から書き出す。/var/www/utsuroi/public/images/cat.jpg。どこから見ても同じ場所を指す - 相対パス — 現在のディレクトリから書く。
../config/secrets.yml。基準点が変わると指し示す場所も変わる
Web サーバがファイルを読むとき、内部で基準ディレクトリ(例: /var/www/utsuroi/public/)があり、ユーザが指定したファイル名をその下から探します。
// 想定される実装 $base = '/var/www/utsuroi/public/images/'; $file = $_GET['file']; // ユーザが指定したファイル名 $path = $base . $file; // 連結 return readfile($path);
3. 特殊な .. #dot-dot
.. は「1つ上の階層」を意味する特別な名前。これを連結することで、基準ディレクトリより上の階層にアクセスできてしまいます。
$base = '/var/www/utsuroi/public/images/';
$file = '../config/secrets.yml'; // ユーザが .. を含む値を送る
$path = '/var/www/utsuroi/public/images/../config/secrets.yml';
// = '/var/www/utsuroi/public/config/secrets.yml'
// ↑ /images/ から1階層上がった /public/config/ に到達
さらに .. を重ねれば、より上位に行ける:
$file = '../../../../etc/passwd'; $path = '/var/www/utsuroi/public/images/../../../../etc/passwd'; // = '/etc/passwd' // ↑ ルートまで遡れば、サーバ内の任意のファイルにアクセス可能
ユーザ入力に .. が含まれることを許すと、攻撃者は基準ディレクトリの「外」のファイルを読めてしまいます。これが Path Traversal(または Directory Traversal)脆弱性です。
4. Web サーバが触るファイル #web-server-files
Web サーバ(nginx、Apache、PHP-FPM、Node.js 等のプロセス)は、特定のユーザ(例: www-data)として動いていて、そのユーザが読めるファイル全てが Path Traversal で漏洩しうる対象です。
Web アプリのプロセスから読めることが多いファイル:
- アプリの設定ファイル(
config.php、secrets.yml等) — DB 認証情報、API キー - アプリのソースコード(.php、.rb、.py 等) — ロジックや脆弱性を分析される
- ログファイル(
/var/log/nginx/access.log) — 他ユーザのリクエスト履歴 - システムファイル(
/etc/passwd) — ユーザ一覧 - SSH 鍵(
.ssh/id_rsa) — サーバへの侵入経路
5. 攻撃者が読みたいファイル #sensitive-files
/etc/passwd は伝統だが、本命は別の所」。
Path Traversal の練習問題でよく /etc/passwd が登場しますが、これは「Path Traversal が成立した」ことを示す指標で、攻撃者が本当に欲しい情報は他にあります。
- アプリの設定ファイル —
.env、config/database.yml、application.properties。DB パスワード、API キー、暗号化鍵 - クラウド認証情報 — AWS の
~/.aws/credentials、メタデータエンドポイント経由の IAM トークン - SSH 鍵 —
~/.ssh/id_rsa。サーバ間移動の踏み台になる - ソースコード — 他の脆弱性を見つけるため
- ログファイル — 他ユーザの行動、内部 API のパス、エラーから漏れるシステム情報
実際の攻撃では、/etc/passwd を試して Path Traversal の存在を確認したら、ターゲットアプリの典型的なパスを総当たりで読み取り、認証情報を取得 → 横展開、というパターンが多い。