Shikata Ga Nai

Private? There is no such things.

区切り文字(デリミタ)の解釈の違いとWeb Cache Deception脆弱性

Hello there, ('ω')ノ

✅ デリミタ(区切り文字)とは?

デリミタとは、URL中で構造を区切るために使われる記号や文字列のことです。

  • 一般的な例:

    • ?:パスとクエリパラメータを分ける
    • #:フラグメント識別子
    • ;:あまり一般的ではないが、Java系で使われる場合がある

🧠 脆弱性の本質:デリミタの解釈の違い

キャッシュとアプリケーションが、区切り文字を異なる意味で解釈すると、Web Cache Deceptionが成立します。


🔍 具体例:/profile;foo.css

🔸 オリジンサーバー(Java Spring)

  • ;「マトリックスパラメータ」 という形式で使用されます。
  • /profile;foo.css;foo.css を無視して /profile として処理
  • 結果:/profile の動的レスポンス(ログインユーザーの個人情報)を返す

🔹 キャッシュサーバー(一般的なCDNなど)

  • ; を特別な意味とは解釈せず、そのままURLの一部と扱う
  • パス:/profile;foo.css.css で終わる静的ファイルに見える
  • 結果:レスポンスがキャッシュされてしまう

💥 攻撃の流れ

  1. 攻撃者が被害者を /profile;foo.css に誘導
  2. 被害者のプロフィールレスポンスがキャッシュされる
  3. 攻撃者が同じURLにアクセスし、被害者の情報を盗み見る

⚠️ 重要なポイント

要素 意味 説明
; マトリックスパラメータ区切り Spring Frameworkのみ対応
.css 静的ファイル拡張子 キャッシュ保存のトリガーになりやすい
/profile;foo.css 解釈の分岐点 アプリとキャッシュで意味が違う

✅ 防御策

対策 内容
サーバー側でセグメント正規化を厳密に行う 不正なセグメントを403で拒否など
キャッシュの拡張子依存を避ける .cssだからキャッシュするというルールは脆弱
セキュリティテスト時にセミコロンやパス末尾を検査 Burp Scanner や DAST ツールで自動化可能

✅ まとめ

;(セミコロン)やその他の区切り文字は、環境やフレームワークによって解釈が異なることがあります。

その結果:

  • アプリは /profile として処理
  • キャッシュは /profile;foo.css として処理
  • → 機密情報が静的ファイルとしてキャッシュされ、情報漏洩が発生

Best regards, (^^ゞ