utsuroi path traversal labs Lab 01 / 5 — Apprentice
01

Path Traversal — 記事添付ファイルから秘密情報を漏洩

Path traversal with no defenses

うつろい journal — 各美容コラムの記事には PDF の添付ファイル(成分解説資料、論文要約等)があり、/articles/download?file=... でダウンロードできる。サーバ側で .. や絶対パスのチェックがされていない

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 単独でも極めて危険な脆弱性。