Hello there, ('ω')ノ
✅ 攻撃の目的
この攻撃では、キャッシュとオリジンサーバーの「区切り文字の解釈の違い」を利用して:
「キャッシュには静的ファイルに見えるURLを保存させ、 オリジンサーバーには動的レスポンスを返させる」
というギャップを作り出し、機密情報を誤ってキャッシュさせます。
🧪 攻撃手順
① 基準レスポンスを取得
- まず、対象のエンドポイントを選びます(例:
/settings/users/list
) - Burp Suite RepeaterでそのURLを送信し、正常なレスポンスを保存
② 任意の文字列をパスに追加
/settings/users/listaaa
- 通常このような不正なURLは、アプリ側でエラーまたはリダイレクトされる
- リダイレクトされる場合、このエンドポイントは攻撃に向かないので変更する
③ 区切り文字候補を挿入して挙動比較
例:;
(セミコロン)を使用
/settings/users/list;aaa
レスポンスの比較:
状況 | 解釈 |
---|---|
基本レスポンスと一致 | ; が区切り文字として扱われ、/list として解釈されている |
listaaa と同じ応答 |
; が区切り文字ではない → list;aaa という新しいパスとして扱われている |
④ 拡張子を追加してキャッシュを騙す
もしセミコロンが区切り文字として機能していれば:
/settings/users/list;profile.js
- アプリは
/list
として処理 → 機密情報含むレスポンスを返す - キャッシュは
.js
付きURLを静的ファイルと認識し、保存してしまう
✅ 攻撃成功のチェックポイント
項目 | 内容 |
---|---|
区切り文字がオリジンで切り捨てられている | /list;xxx が /list と同じレスポンスを返す |
拡張子がついたURLでキャッシュされるか確認 | .js , .css , .ico などを試す |
X-Cache: hit が確認できればキャッシュ成功 |
キャッシュとオリジンの分離が成立した証拠 |
💡 試すべき区切り文字候補
候補 | 備考 |
---|---|
; |
Java Spring でよく使われる(マトリックスパラメータ) |
. |
Ruby on Rails などでフォーマット指定に使われる |
%00 |
OpenLiteSpeedでNULL終端文字になる(注意:多くはエラー扱い) |
+ , %2F , %3B |
URLエンコード形でも試す価値あり |
✅ まとめ
「オリジンサーバーは区切り文字でパスを打ち切り、キャッシュはそのまま解釈する」 この差を使って、動的レスポンスを静的ファイル風のURLでキャッシュさせるのがこの手法の核です。
ステップ | チェック |
---|---|
区切り文字がサーバーに無視される | → OK |
拡張子付きでキャッシュに保存される | → OK |
被害者に誘導し、攻撃者が取得できる | → 成立! |
Best regards, (^^ゞ