Shikata Ga Nai

Private? There is no such things.

区切り文字のズレを悪用したWeb Cache Deception攻撃の実践手法

Hello there, ('ω')ノ

✅ 攻撃の目的

この攻撃では、キャッシュとオリジンサーバーの「区切り文字の解釈の違い」を利用して:

「キャッシュには静的ファイルに見えるURLを保存させ、 オリジンサーバーには動的レスポンスを返させる」

というギャップを作り出し、機密情報を誤ってキャッシュさせます。


🧪 攻撃手順

① 基準レスポンスを取得

  1. まず、対象のエンドポイントを選びます(例:/settings/users/list
  2. 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, (^^ゞ