Shikata Ga Nai

Private? There is no such things.

パスマッピングのズレを悪用したWeb Cache Deception攻撃:拡張子の追加でキャッシュを騙す方法

Hello there, ('ω')ノ

✅ 攻撃の概要

パスマッピングのズレによるWeb Cache Deceptionは:

サーバーは動的レスポンスを返すが、キャッシュは静的ファイルだと誤解して保存してしまう

という挙動を利用して、機密情報を不正にキャッシュ化させる手法です。


🧪 テスト手順

① オリジンサーバーのURLマッピングをテスト

  1. 対象エンドポイントを確認(例:/api/orders/123
  2. これに余分なパス要素を追加(例:/api/orders/123/foo
  3. レスポンスが変わらず同じ注文情報を返してくる場合

    • サーバーが/fooを無視している=REST的な抽象化が行われている

② キャッシュサーバーのルールをテスト

  1. さらにパス末尾に静的拡張子を追加(例:/api/orders/123/foo.js
  2. 同じリクエストを2回送信し、2回目の応答が高速 or X-Cache: hit であるかを確認
  3. もしそうなら:

    ✅ キャッシュが拡張子付きURL全体を静的ファイルと解釈して保存している.js.cssなど特定の拡張子に対してキャッシュルールが適用されている


③ 試すべき拡張子の例

拡張子 理由
.css 典型的な静的スタイルファイル
.js スクリプトファイルとして扱われやすい
.ico ファビコン扱いされがち
.exe, .zip, .png 一部CDNが対応している場合あり

🔥 攻撃の構築例

/api/orders/123 → 注文情報(動的、キャッシュ不可)
/api/orders/123/temp.css → 見た目は静的、内容は注文情報 → キャッシュされる
  1. 攻撃者がこのURLに被害者を誘導
  2. 被害者の情報がキャッシュに保存される
  3. 攻撃者が同じURLを叩いて情報を盗み見る

✅ 攻撃が成立する条件のまとめ

条件 内容
サーバーが末尾のパスセグメントを無視 /123/foo/123/foo.js/123 と同様に処理
キャッシュがURL末尾の拡張子を元に保存判断 .css.js付きだと静的と判断
被害者のセッション状態でアクセスさせる方法がある リンク、XSS、メールなど

🧰 自動化支援ツール

  • Burp Scanner(Pro版):監査時にWeb Cache Deceptionの検出可能
  • Web Cache Deception Scanner(BApp拡張):キャッシュ挙動を自動でテスト

✅ まとめ

テスト内容 方法
サーバーがURLをどう解釈しているか パスを追加してもレスポンスが変わるか確認
キャッシュが何を保存するか 拡張子付きURLに変えて、キャッシュが効くか確認
拡張子の効果 .css, .js, .icoなど様々な拡張子で試す

Best regards, (^^ゞ