うつろい journal — 各美容コラムの記事には PDF の添付ファイル(成分解説資料、論文要約等)があり、/articles/download?file=... でダウンロードできる。サーバ側で .. や絶対パスのチェックがされていない。
舞台
Mission
Path Traversal を使って、サーバ内の機密ファイル(アプリの設定ファイル、システムユーザ一覧、SSH 鍵)を読み取ってください。3つ以上の機密ファイルを取得すれば成功。
サーバのファイル構造(参考)
ダウンロード API の基準ディレクトリは /var/www/utsuroi/articles/。攻撃者の視点では、相対パスでこの外側に到達できるはず。
/ (ルート)
├── etc/
│ ├── passwd ← システムユーザ一覧
│ ├── shadow ← パスワードハッシュ(普通は読めない)
│ └── nginx/
├── home/
│ └── ec_user/
│ └── .ssh/
│ └── id_rsa ← SSH 秘密鍵
├── var/
│ └── www/
│ └── utsuroi/
│ ├── articles/ ← 基準ディレクトリ(ここから ../ で外に出る)
│ │ ├── 2025-04-skincare.pdf
│ │ ├── 2025-05-makeup.pdf
│ │ └── 2025-06-fragrance.pdf
│ └── config/
│ └── secrets.yml ← DB 認証情報・API キー
└── ...
ファイルダウンロード
クイック試行:
https://journal.utsuroi.example.com/articles/download?file=2025-04-skincare.pdf
(まだファイルを取得していません)
何が起きているか — シミュレーター解説
脆弱なサーバ実装(うつろい journal のダウンロード処理)
// GET /articles/download?file=... $base = '/var/www/utsuroi/articles/'; $file = $_GET['file']; // ユーザ入力をそのまま $path = $base . $file; // 文字列連結 return readfile($path); // ↑ ../ や絶対パスのチェックなし
基準ディレクトリ /var/www/utsuroi/articles/ にユーザ入力をそのまま連結しているだけ。.. を含む値で簡単に基準の外に出られます。
パス解決のトレース
$base = '/var/www/utsuroi/articles/' $file = '2025-04-skincare.pdf' $path = '/var/www/utsuroi/articles/2025-04-skincare.pdf'
これまでの取得履歴
ヒント
ヒント 1 — 基準ディレクトリの外に出る
基準は /var/www/utsuroi/articles/。1つ上(/var/www/utsuroi/)に出るには ../、3つ上(/var/)に出るには ../../../、ルートに到達するには ../../../../ を使います。
ヒント 2 — 試すべき場所
「サーバのファイル構造」セクションで 赤色 でハイライトされているのが機密ファイル。それぞれへのパスを組み立てて取得してみてください。クイック試行ボタンも使えます。
正解(ネタバレ)
以下の3つのうち、いずれか3件以上を取得すると Mission 達成:
../config/secrets.yml— アプリの DB 認証情報、API キー../../../etc/passwd— システムユーザ一覧(伝統的な指標)../../../home/ec_user/.ssh/id_rsa— サーバへの SSH 秘密鍵
実際の攻撃では、secrets.yml から DB パスワードを盗み、DB に直接アクセスして全顧客情報を漏洩させる、SSH 鍵で他のサーバに横展開する、といった連鎖被害が発生します。Path Traversal 単独でも極めて危険な脆弱性。
必要な前提知識
サイト側の対策