Hello there, ('ω')ノ
✅ 目的
ここでは、前ステップで特定したオリジンサーバーが使う区切り文字(delimiter)を利用しつつ、キャッシュがそれを無視するケースを狙って機密情報をキャッシュさせる方法を詳しく解説します。
🎯 攻撃の条件
次の2つが同時に成立すれば攻撃が成功します:
オリジンサーバーが区切り文字でパスを打ち切る →
/settings;abc.js
→/settings
として処理し、動的レスポンスを返すキャッシュが区切り文字を無視して拡張子付き全体を処理 →
.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, (^^ゞ