以下の内容はhttps://cysec148.hatenablog.com/entry/2025/09/22/070823より取得しました。


Lab: Exploiting path mapping for web cache deception — 解説と手順

Hello there, ('ω')ノ

動画

youtu.be

1. タイトル

Lab: Exploiting path mapping for web cache deception — パス正規化の差異を突いた Web Cache Deception で API キーを奪取


2. 注意書き

重要:この手順は学習目的であり、ラボ以外の環境で絶対に実行しないでください。


3. 概要(この文書で何を学べるか)

このラボでは、オリジンサーバ(アプリ)CDN/リバースプロキシのキャッシュURL パスの解釈(正規化)を異なる規則で行うことを突く Web Cache Deception (WCD) を学びます。 ゴールは、被害者 carlos の /my-account レスポンス(API キーを含む)静的拡張子付きの偽パスでキャッシュさせ、攻撃者が同じ URL を後から閲覧して API キーを読むことです。


4. 必要な前提知識(短い箇条書き)

  • パス正規化と正規表現ルーティング:アプリ側は /my-account/abc抽象化して /my-account として扱うことがある。
  • キャッシュの拡張子ベース規則:CDN は .js など 静的拡張子が付くパスを キャッシュ対象にしがち。
  • ヘッダ観察X-Cache: miss/hitCache-Control: max-age=... でキャッシュの有無・寿命を判断。

5. 攻撃(検証)方針(なぜその順序か)

  1. 自分のアカウントでログインし、/my-account のレスポンスに API キーがあることを確認 — 攻撃価値の確認。
  2. /my-account に余分なパスを付与しても内容が変わらない(オリジンが抽象化する)ことを確認 — ルーティングの手がかり。
  3. さらに静的拡張子(例 .js)を付けてキャッシュが有効になることを確認X-CacheCache-Control を観察。
  4. エクスプロイトサーバから被害者をその URL に誘導して「被害者の /my-account をその URL にキャッシュ」させる
  5. キャッシュ寿命内に同じ URL を攻撃者が閲覧して被害者の API キーを取得

6. ステップ別の概要(やること / 意図 / 期待される出力)

ステップ 1:ログインして API キーが露出することを確認

  • やること:Burp の内蔵ブラウザで wiener:peter でログイン。
  • 意図/my-account のレスポンス本文に 自分の API キーが含まれるのを確認(奪取対象があることを把握)。
  • 期待:ページ中にキー(トークン文字列)が表示される。

ステップ 2:オリジンのパス抽象化を確認

  • やること:Proxy → HTTP history から GET /my-account を Repeater に送り、パスを /my-account/abc に変更して送信。
  • 意図余分パスがあっても 同じアカウントページが返る=アプリは /my-account正規化している。
  • 期待:レスポンス本文は同じく API キーを含む自分のアカウント情報

ステップ 3:静的拡張子でキャッシュを有効化

  • やること:Repeater でパスを /my-account/abc.js に変更して送信。

  • 意図:キャッシュが 静的拡張子を見てエントリを作るか確認。

  • 期待X-Cache: missCache-Control: max-age=30(例)が付き、再送すると X-Cache: hit に変わる(同じ URL がキャッシュから配信される)。

ステップ 4:エクスプロイトで被害者を誘導(キャッシュ汚染)

  • やること:Exploit server の Body に以下を配置(自分のラボ ID に置換・新しい任意セグメント名にする):
  <script>
    document.location="https://YOUR-LAB-ID.web-security-academy.net/my-account/wcd.js";
  </script>

Deliver exploit to victim を実行。

  • 意図:carlos が ログイン済みの状態で /my-account/my-account/wcd.js として取得 → オリジンは /my-account に正規化して carlos のページを返すキャッシュは /my-account/wcd.js を静的資産として保存

  • 期待:この時点で /my-account/wcd.js のキャッシュには carlos の API キーを含むレスポンスが保存される。

ステップ 5:攻撃者がキャッシュから carlos のキーを取得

  • やること:30 秒以内(max-age 内)に
  https://YOUR-LAB-ID.web-security-academy.net/my-account/wcd.js

へアクセス。

  • 意図キャッシュ済みの carlos のレスポンスを取得する。

  • 期待:本文に carlos の API キーが含まれる。コピーして Submit solution で提出し、ラボクリア。


7. トラブルシューティング(成功しない場合のチェック)

  • X-Cache が常に miss拡張子.js になっているか、同一の完全一致 URL を再送しているかを確認。TTL(例 30 秒)を過ぎていないか。
  • 被害者のレスポンスが取れない:Exploit の 任意セグメント名を新規にして再送(以前の自分のキャッシュを参照している可能性)。
  • ログイン状態の影響:carlos が閲覧したタイミングで その URL がキャッシュされることが重要。Exploit 配信後に確認を。
  • キャッシュ寿命切れCache-Control: max-age を超えたら再度誘導→即確認。

8. なぜこれが危険なのか(本質)

  • パス解釈の不一致オリジンは抽象化して動的ページを返す一方、キャッシュは拡張子で静的扱いして保存 → 動的・機密ページが静的 URL として第三者に配布される。
  • セッション依存の機密情報の漏洩:個人の API キー・個人情報誰でもアクセス可能なキャッシュに載る。

9. 防御(実務で取るべき対策)

  1. キャッシュポリシーの厳格化:動的・認証必須のパスには常に Cache-Control: no-store, private を付与。
  2. パス正規化の一致キャッシュ層とオリジンで同じ正規化規則(特に末尾スラッシュ、余分セグメント、拡張子)を適用。
  3. 拡張子ベースのキャッシュを制限/my-account/* のような動的領域では 拡張子有無に関係なく非キャッシュに。
  4. 認証コンテンツのキャッシュ禁止:Set-Cookie と同時に配信されるレスポンスに 強制 no-store
  5. 監視・検出:不審なパス(/dynamic/xxx.js 等)での急なキャッシュヒット増加を検出。

10. 検証の確認ポイント(ラボでの成功条件)

  • /my-account/wcd.js にアクセスして carlos の API キーが見える。
  • Submit solution でそのキーを提出し Solved が表示。

11. まとめ

オリジンは /my-account/abc(.js)/my-account に抽象化 → キャッシュは .js を静的として保存 → 被害者でキャッシュを汚染 → 同 URL を攻撃者が閲覧して API キーを取得(ラボクリア)

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/09/22/070823より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14