Web缓存欺骗:检测缓存响应的详细指南


1. 核心响应头解析
X-Cache
  • X-Cache: hit

    • 含义:响应来自缓存服务器,而非源服务器。

    • 攻击意义:确认缓存规则已生效,攻击者可以利用缓存存储的数据。

    • 示例:

       http
  •  HTTP/1.1 200 OK
     X-Cache: hit
     ...

X-Cache: miss

  • 含义:缓存中没有该资源,响应由源服务器生成。

  • 攻击意义:首次触发缓存存储的关键步骤,需重复请求验证是否缓存。

  • 示例:

     http
  •  HTTP/1.1 200 OK
     X-Cache: miss
     ...

X-Cache: dynamic

  • 含义:源服务器动态生成内容,通常不会被缓存。

  • 防御机制:动态资源(如用户会话页面)应标记为此类。

  • 示例:

     http
    •  HTTP/1.1 200 OK
       X-Cache: dynamic
       ...
  • X-Cache: refresh

    • 含义:缓存内容已过期,正在向源服务器重新验证。

    • 调试建议:观察多次请求后是否变为 hit,确认缓存刷新策略。

Cache-Control
  • Cache-Control: public, max-age=30

    • 含义:资源可被公开缓存,有效期为30秒。

    • 攻击意义:缓存时间窗口明确,便于规划攻击步骤。

    • 示例:

       http
    •  HTTP/1.1 200 OK
       Cache-Control: public, max-age=30
       ...
  • Cache-Control: private

    • 含义:资源仅允许特定用户(如登录用户)缓存。

    • 防御意义:避免敏感数据被全局缓存。

  • Cache-Control: no-store

    • 含义:禁止任何形式的缓存。

    • 安全配置:动态敏感接口应添加此头。


2. 检测缓存的实战步骤
步骤 1:观察初始请求
  1. 使用 Burp Suite 发送请求至目标 URL(如 /my-account)。

  2. 查看响应头中的

     X-Cache

     Cache-Control

    • X-Cache: miss,说明未命中缓存。

    • 记录 Cache-Control: max-age 的值(如30秒)。

步骤 2:重复请求验证缓存
  1. 立即重发同一请求:

    • X-Cache: hit,说明缓存已生效。

    • 若仍为 miss,可能缓存未启用或配置错误。

  2. 等待 max-age 过期后重试:

    • 超过缓存时间后,X-Cache 应变回 miss

    • 确认缓存刷新逻辑是否符合预期。

步骤 3:修改路径触发缓存规则
  1. 添加静态扩展名:

    • 修改路径为 /my-account/test.js,发送请求。

    • 观察是否出现 X-Cache: hit,确认缓存规则基于扩展名。

  2. 变换路径参数:

    • 测试 /my-account/123.css/my-account/abc.png 等。

    • 确定哪些扩展名触发了缓存。

步骤 4:利用时间差验证缓存
  1. 首次请求:记录响应时间(如 500ms)。

  2. 重复请求:若响应时间显著下降(如 50ms),可能是缓存生效。

    • 注意:需排除网络波动影响,多次测试取平均值。


3. Web 缓存欺骗攻击中的关键检测点
攻击场景示例
  1. 目标:窃取用户 carlos 的 API 密钥。

  2. 漏洞利用条件:

    • 缓存服务器将 /my-account/*.js 识别为可缓存静态资源。

    • 源服务器忽略 .js 后缀,返回动态用户数据。

检测与利用流程
  1. 探测缓存规则:

    • 发送 GET /my-account/attack.js,观察 X-Cache: hit

  2. 诱导受害者访问:

    • 构造恶意链接,让 carlos 访问 /my-account/attack.js

  3. 读取缓存数据:

    • max-age=30 有效期内,攻击者访问同一 URL,获取缓存中的 carlos 数据。


4. 高级调试技巧
缓存键(Cache Key)分析
  • 定义:缓存服务器用来唯一标识资源的键值,通常包含:

    • URL 路径(如 /my-account/attack.js)。

    • 请求方法(GET/POST)。

    • 部分请求头(如 Accept-Language)。

  • 攻击影响:

    • 若缓存键不包含用户身份信息(如 Cookie),不同用户的数据可能被混淆缓存。

手动测试缓存键
  1. 修改请求头:

    • 添加/删除 Accept-Encoding: gzip,观察是否影响缓存命中。

  2. 变换 URL 参数:

    • 测试 /my-account/attack.js?test=1/my-account/attack.js?test=2 是否共享缓存。

利用 Age 头判断缓存新旧
  • Age: 15:表示资源已在缓存中存储了15秒。

  • 攻击意义:

    • Age 接近 max-age,需尽快利用,避免缓存过期。


5. 常见陷阱与解决方案
陷阱 1:Cache-Control 被忽略
  • 现象:响应头标记 no-store,但缓存仍存储数据。

  • 原因:缓存服务器配置错误,覆盖了源服务器指令。

  • 解决方案:

    • 检查缓存服务器(如 Varnish)配置,确保遵循 Cache-Control

陷阱 2:动态内容被意外缓存
  • 现象:用户会话页面(如 /my-account)被缓存,导致数据泄露。

  • 解决方案:

    • 服务端强制添加 Cache-Control: private, no-store

    • 缓存服务器配置正则规则,排除动态路径(如 ^/my-account)。

陷阱 3:缓存键包含敏感信息
  • 现象:缓存键包含 Authorization 头,导致攻击者无法读取其他用户缓存。

  • 解决方案:

    • 缓存服务器配置中,从缓存键移除敏感头字段。


6. 自动化检测工具推荐
  1. Burp Suite 插件:

    • Collaborator Everywhere:自动化探测缓存行为,识别外部服务交互。

    • Active Scan++:检测缓存配置不当漏洞。

  2. 命令行工具:

    • curl:多次发送请求,观察

       X-Cache

      变化。

       bash
    •  curl -I http://example.com/my-account/attack.js
    • wrk:压力测试,观察响应时间一致性。


7. 总结
  • 缓存检测核心:通过 X-CacheCache-Control 头快速判断缓存行为。

  • 攻击关键点:利用路径解析差异和时间窗口窃取敏感数据。

  • 防御要点:严格限制动态资源缓存,校验缓存键组成。

你可能感兴趣的:(缓存,web安全,网络安全,网络,安全)