Shikata Ga Nai

Private? There is no such things.

Web Cache Poisoning(Webキャッシュポイズニング)診断マニュアル

Hello there, ('ω')ノ

🎯 1. Web Cache Poisoningとは?

Web Cache Poisoning(キャッシュポイズニング)とは、 キャッシュサーバ(例:CDN, プロキシ, リバースプロキシ)に悪意あるレスポンスを保存させ、他のユーザへ配信させる攻撃です。

例:攻撃者が「悪意あるJSを含むレスポンス」をキャッシュさせ、 正常ユーザがそれを受け取ってXSSを実行される


📦 2. 仕組みと対象となる構成

要素 内容
クライアント → CDN/キャッシュ → アプリサーバ
通常:1回目はアプリから取得し、2回目以降はキャッシュから返す
攻撃者がキャッシュされるレスポンスを「毒入り」にすることで、他人にも影響を与える

⚠️ 3. よくある脆弱なパターン

パターン 内容 影響
キャッシュキーが一部ヘッダやパラメータに依存しない X-Host: attacker.com を使ってもキャッシュが共有される 攻撃内容が他ユーザに配信される
レスポンスにユーザ入力を含む ?lang=<script> のように反映される XSSなどを含んだレスポンスをキャッシュさせられる
リクエストパラメータにより振る舞いが変わるが、キャッシュは分けられない 例:?debug=true で詳細エラーがキャッシュされる 情報漏洩・誤動作の原因

🧪 4. 診断手順(基本)

✅ Step 1:キャッシュされるリソースを探す

  • ページや静的ファイルではなく、動的レスポンスでもキャッシュされているもの
  • 例:/home, /search, /profile, /product?id=1 など

✅ Step 2:以下のようなユーザ入力をレスポンスに反映できる場所を探す

  • Host ヘッダ、X-Forwarded-HostX-Original-URL
  • クエリパラメータ(?foo=<script>alert(1)</script>
  • 特定のCookieやRefererなども対象

✅ Step 3:PoC(Poisoning)を試す

GET / HTTP/1.1
Host: vulnerable.site
X-Forwarded-Host: evil.com

→ レスポンスに evil.com が含まれ、それがキャッシュされたら成功


🧠 5. テスト用ペイロード例

クエリパラメータを反映させるタイプ:

https://example.com/?q=<script>alert(1)</script>

→ これがキャッシュされて他ユーザに配信されたら XSS + キャッシュポイズニング


特殊ヘッダ:

X-Forwarded-Host: attacker.com
X-Forwarded-Scheme: javascript

コンテンツ型:

X-Content-Type-Options: nosniff
Content-Type: text/html

→ 本来JSONで返すはずのエンドポイントをHTMLとして配信させ、悪意ある内容をキャッシュ


🧰 6. 補助ツール

ツール 機能
Burp Suite(Cache Poisoningスキャナ) 自動でヘッダの影響調査を実施
Param Miner(Burp拡張) レスポンスに影響を与えるパラメータを探す
curl + diff 同じリソースに対する異なるリクエストのレスポンス差分確認に便利

✅ 7. 成功のサイン

結果 解釈
悪意ある入力が他人のレスポンスに含まれている キャッシュポイズニング成功
同じURLでも、パラメータやヘッダによりレスポンス内容が変化するのにキャッシュが分離されていない 脆弱性あり

🔐 8. サーバ側での防御チェックポイント

対策 説明
キャッシュキーにパラメータやヘッダを含める キャッシュの分離が必須(Varyヘッダ使用)
ユーザ入力をHTMLに含めるときはサニタイズ XSSを防ぐため
Content-Type制御 JSON APIなら application/json を強制すべき
X-Forwarded- の信頼制限* 任意ヘッダを信用しない設定が必要

📌 9. よくある診断対象

  • CDN配下のサイト(Cloudflare, Akamai, Fastlyなど)
  • キャッシュ中継を行っているAPI Gateway
  • Cache-Control: public が含まれているレスポンス
  • ページにパラメータの影響が見られるが、URLが変わらない場合

🎁 補足:より高度な攻撃例(中級〜)

  • Cookieを分離しないキャッシュ:ログイン状態によって表示が変わるが、同一URLでキャッシュされる
  • オリジンと異なるホスト名による攻撃:XSSポリシーやbaseタグを乗っ取る

Web Cache Poisoningは、「一度仕掛けた毒が全ユーザに影響する」という非常に危険な脆弱性です。 診断時にはキャッシュの挙動の観察レスポンス差分の検出が重要になります。

Best regards, (^^ゞ