【由浅入深_打牢基础】WEB缓存投毒(上)
字数 1729 2025-08-06 21:48:45

WEB缓存投毒技术详解

0x01 WEB缓存投毒基础概念

什么是WEB缓存投毒

WEB缓存投毒是一种攻击技术,攻击者利用缓存机制将有害的HTTP响应提供给其他用户。当用户发起请求时,请求会先经过缓存检查,如果缓存中不存在该请求的响应,后端才会处理请求并将响应添加到缓存中。之后的用户如果发送等效请求,会直接从缓存中获取响应。

缓存键(Cache Key)机制

后端通过"缓存键"来判断两个用户的请求是否等效:

  • 缓存键:预先定义的请求头中的一些键作为缓存键,只要这些键的值相同,后端就认为两个请求等效
  • 非缓存键:头部中除缓存键外的其他键

WEB缓存投毒依赖于非缓存键,因为:

  1. 缓存键通常不能改变(否则无法与其他用户等效)
  2. 页面必须存在根据非缓存键的值动态生成的内容

攻击示例

GET / HTTP/1.1
Host: test.com
X-Forwarded-Host: #'></a><script>alert(1)</script> //

响应变为:

<a href='#'></a><script>alert(1)</script> //'></a>

0x02 漏洞利用技术详解

2.1 带有未键标头的Web缓存投毒

利用工具:Burp Suite的Param Miner插件

步骤

  1. 使用Param Miner探测影响响应的非缓存键(右键请求包 > Guess headers)
  2. 发现X-Forwarded-Host标头会影响响应
  3. 构造恶意请求:
    GET / HTTP/1.1
    Host: target.com
    X-Forwarded-Host: attacker.com
    
  4. 确保请求不被缓存(添加随机参数)
  5. 验证缓存是否命中(查看X-Cache响应头)

关键点

  • 必须投毒根页面(/)而非特定产品页面
  • 使用X-Forwarded-Host控制页面中的链接或脚本来源

2.2 使用未键入的cookie进行Web缓存投毒

利用条件

  • Cookie中存在未作为缓存键的参数
  • 响应内容会根据该cookie值动态生成

攻击步骤

  1. 发现fehost cookie参数影响响应
  2. 构造恶意cookie:
    fehost=someString"%2Balert(1)%2B"someString
    
  3. 投毒根页面
  4. 等待其他用户访问触发XSS

2.3 具有多个标头的Web缓存投毒

技术要求

  • 需要同时利用多个非缓存标头
  • 常见组合:X-Forwarded-Host + X-Forwarded-Scheme

攻击流程

  1. 使用Param Miner探测发现X-Forwarded-Scheme
  2. 结合X-Forwarded-Host构造请求:
    GET / HTTP/1.1
    Host: target.com
    X-Forwarded-Host: attacker.com
    X-Forwarded-Scheme: http
    
  3. 利用重定向机制控制JS文件加载路径
  4. 投毒/resources/js/tracking.js等静态资源

2.4 使用未知标头的有针对性的Web缓存投毒

特殊条件

  • Vary响应头中包含User-Agent
  • 需要获取目标用户的UA信息

攻击步骤

  1. 发现X-Host标头影响响应
  2. 通过留言板等XSS收集目标用户UA:
    
    
  3. 构造匹配UA的投毒请求:
    GET / HTTP/1.1
    Host: target.com
    X-Host: attacker.com/js/malicious.js
    User-Agent: [目标UA]
    
  4. 投毒后等待特定用户访问

2.5 通过无键查询字符串导致Web缓存投毒

特征

  • URL查询参数不作为缓存键
  • 参数值直接影响响应内容

攻击方法

  1. 发现参数可构造XSS:
    /?param=<script>alert(1)</script>
    
  2. 直接投毒根页面
  3. 其他用户访问任何等效请求都会触发恶意脚本

2.6 通过未键入查询参数的Web缓存投毒

关键技术

  • 部分参数被排除在缓存键外(如UTM参数)
  • UTM参数通常用于分析,不作为缓存依据

攻击流程

  1. 使用Param Miner探测非缓存参数
  2. 发现utm_content等参数不影响缓存
  3. 构造投毒请求:
    /?normal_param=value&utm_content=<script>alert(1)</script>
    
  4. 投毒后所有访问/?normal_param=value的用户都会受害

2.7 参数隐藏技术

高级技巧

  • 利用参数解析顺序和分号特性
  • 结合缓存键与非缓存键参数

攻击步骤

  1. 发现JS文件带参数:
    /js/tracker.js?callback=setCountryCookie
    
  2. 测试参数是否缓存键:
    • 修改callback值 → 缓存未命中 → 是缓存键
  3. 添加非缓存参数:
    /js/tracker.js?callback=setCountryCookie;utm_content=xxx
    
  4. 构造复杂投毒:
    /js/tracker.js?callback=setCountryCookie;utm_content=;callback=alert(1)
    
  5. 响应中包含恶意代码但使用原始缓存键

防御措施

  1. 严格定义缓存键:确保所有用户输入相关参数都作为缓存键
  2. 限制动态内容:避免使用不可信的头/参数生成响应
  3. 缓存净化:对缓存内容进行安全检查
  4. Vary头谨慎使用:避免过度依赖User-Agent等易变头
  5. 参数白名单:限制可接受的查询参数和头

工具推荐

  1. Param Miner:Burp插件,自动探测非缓存键
  2. Burp Scanner:检测缓存投毒漏洞
  3. 自定义脚本:自动化测试参数组合

通过深入理解这些技术和案例,安全人员可以更好地发现和防御WEB缓存投毒漏洞。

WEB缓存投毒技术详解 0x01 WEB缓存投毒基础概念 什么是WEB缓存投毒 WEB缓存投毒是一种攻击技术,攻击者利用缓存机制将有害的HTTP响应提供给其他用户。当用户发起请求时,请求会先经过缓存检查,如果缓存中不存在该请求的响应,后端才会处理请求并将响应添加到缓存中。之后的用户如果发送等效请求,会直接从缓存中获取响应。 缓存键(Cache Key)机制 后端通过"缓存键"来判断两个用户的请求是否等效: 缓存键 :预先定义的请求头中的一些键作为缓存键,只要这些键的值相同,后端就认为两个请求等效 非缓存键 :头部中除缓存键外的其他键 WEB缓存投毒依赖于 非缓存键 ,因为: 缓存键通常不能改变(否则无法与其他用户等效) 页面必须存在根据非缓存键的值动态生成的内容 攻击示例 响应变为: 0x02 漏洞利用技术详解 2.1 带有未键标头的Web缓存投毒 利用工具 :Burp Suite的Param Miner插件 步骤 : 使用Param Miner探测影响响应的非缓存键(右键请求包 > Guess headers) 发现 X-Forwarded-Host 标头会影响响应 构造恶意请求: 确保请求不被缓存(添加随机参数) 验证缓存是否命中(查看 X-Cache 响应头) 关键点 : 必须投毒根页面(/)而非特定产品页面 使用 X-Forwarded-Host 控制页面中的链接或脚本来源 2.2 使用未键入的cookie进行Web缓存投毒 利用条件 : Cookie中存在未作为缓存键的参数 响应内容会根据该cookie值动态生成 攻击步骤 : 发现 fehost cookie参数影响响应 构造恶意cookie: 投毒根页面 等待其他用户访问触发XSS 2.3 具有多个标头的Web缓存投毒 技术要求 : 需要同时利用多个非缓存标头 常见组合: X-Forwarded-Host + X-Forwarded-Scheme 攻击流程 : 使用Param Miner探测发现 X-Forwarded-Scheme 结合 X-Forwarded-Host 构造请求: 利用重定向机制控制JS文件加载路径 投毒 /resources/js/tracking.js 等静态资源 2.4 使用未知标头的有针对性的Web缓存投毒 特殊条件 : Vary 响应头中包含 User-Agent 需要获取目标用户的UA信息 攻击步骤 : 发现 X-Host 标头影响响应 通过留言板等XSS收集目标用户UA: 构造匹配UA的投毒请求: 投毒后等待特定用户访问 2.5 通过无键查询字符串导致Web缓存投毒 特征 : URL查询参数不作为缓存键 参数值直接影响响应内容 攻击方法 : 发现参数可构造XSS: 直接投毒根页面 其他用户访问任何等效请求都会触发恶意脚本 2.6 通过未键入查询参数的Web缓存投毒 关键技术 : 部分参数被排除在缓存键外(如UTM参数) UTM参数通常用于分析,不作为缓存依据 攻击流程 : 使用Param Miner探测非缓存参数 发现 utm_content 等参数不影响缓存 构造投毒请求: 投毒后所有访问 /?normal_param=value 的用户都会受害 2.7 参数隐藏技术 高级技巧 : 利用参数解析顺序和分号特性 结合缓存键与非缓存键参数 攻击步骤 : 发现JS文件带参数: 测试参数是否缓存键: 修改 callback 值 → 缓存未命中 → 是缓存键 添加非缓存参数: 构造复杂投毒: 响应中包含恶意代码但使用原始缓存键 防御措施 严格定义缓存键 :确保所有用户输入相关参数都作为缓存键 限制动态内容 :避免使用不可信的头/参数生成响应 缓存净化 :对缓存内容进行安全检查 Vary头谨慎使用 :避免过度依赖User-Agent等易变头 参数白名单 :限制可接受的查询参数和头 工具推荐 Param Miner :Burp插件,自动探测非缓存键 Burp Scanner :检测缓存投毒漏洞 自定义脚本 :自动化测试参数组合 通过深入理解这些技术和案例,安全人员可以更好地发现和防御WEB缓存投毒漏洞。