Shikata Ga Nai

Private? There is no such things.

区切り文字のズレを悪用してWeb Cache Deceptionを成立させる方法(応用編)

Hello there, ('ω')ノ

✅ 目的

ここでは、前ステップで特定したオリジンサーバーが使う区切り文字(delimiter)を利用しつつ、キャッシュがそれを無視するケースを狙って機密情報をキャッシュさせる方法を詳しく解説します。


🎯 攻撃の条件

次の2つが同時に成立すれば攻撃が成功します:

  1. オリジンサーバーが区切り文字でパスを打ち切る/settings;abc.js/settings として処理し、動的レスポンスを返す

  2. キャッシュが区切り文字を無視して拡張子付き全体を処理.js.css なので静的ファイルと誤認してキャッシュ


🧪 テスト方法

① 区切り文字を特定済みである前提

例:; がオリジンサーバーで区切り文字と判明


.js などの拡張子を加えて送信

/settings;abc.js

✅ 成功の兆候:

観察対象 成功時の挙動
レスポンス内容 /settings と同じ内容(機密情報が含まれている)
ヘッダー X-Cache 初回:miss → 2回目:hit になっている
ヘッダー Cache-Control max-age=xx がありキャッシュ許可されている

③ Burp Intruderを使って大量テスト(自動化)

💡 設定ポイント:

  • 「Payloads」タブ → Payload encodingをオフ%3B%00 に自動エンコードされないようにする

💥 試す区切り文字例(ASCII全体 + よく使われるもの)

文字 説明
; Springのマトリックスパラメータ
. Railsのレスポンスフォーマット切り替え
%00 OpenLiteSpeedなどがNULL終端で切り捨て
: + , ! @ = フレームワーク依存で挙動変化する可能性あり

🧠 テスト結果の見分け方

結果 解釈
同じレスポンス + X-Cache: hit 攻撃可能(情報がキャッシュされている)
異なるレスポンス or エラー 区切り文字として機能しなかった可能性あり
X-Cache: miss のまま キャッシュ保存対象外 or 条件不足

✅ 実戦構成例

/profile;attack.js
  • アプリ:; 以降を無視 → /profile → ユーザー情報が含まれたレスポンスを返す
  • キャッシュ:.js で静的と誤解 → キャッシュに保存
  • 攻撃者:同じURLでアクセス → 他人のプロフィール情報を閲覧可能

✅ まとめ

要素 内容
オリジンとキャッシュの「解釈の差」が鍵 片方が区切る、もう片方が無視するケースを狙う
.js, .css, .ico, .exe など拡張子が有効 → 静的ファイルと誤解させて保存
Burp Intruder で効率的に総当たり可能 → Payload encodingをオフにするのがコツ

Best regards, (^^ゞ