【由浅入深_打牢基础】WEB缓存投毒(上)
字数 1763 2025-08-27 12:33:37

WEB缓存投毒技术详解

一、WEB缓存投毒基础概念

1.1 什么是WEB缓存投毒

WEB缓存投毒是一种攻击技术,攻击者利用缓存机制将有害的HTTP响应提供给其他用户。当恶意响应被缓存后,所有访问相同资源的用户都会收到这个被污染的响应。

1.2 缓存工作原理

缓存机制的工作流程:

  1. 用户发起请求时,请求首先经过缓存服务器
  2. 如果缓存中存在匹配的响应,直接返回给用户
  3. 如果缓存中不存在,请求会被转发到后端服务器
  4. 后端服务器响应后,响应会被添加到缓存中
  5. 后续用户的等效请求将从缓存中获取响应

1.3 缓存键(Cache Key)与非缓存键

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

缓存投毒的关键在于利用非缓存键,因为:

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

二、漏洞利用技术

2.1 基本利用条件

成功的WEB缓存投毒需要满足两个条件:

  1. 存在可被利用的非缓存键
  2. 页面内容会根据非缓存键的值动态生成

2.2 利用未键标头的投毒

案例:利用X-Forwarded-Host头

  1. 使用Param Miner插件探测影响响应的非缓存键
  2. 发现X-Forwarded-Host影响页面内容
  3. 构造恶意请求:
    GET / HTTP/1.1
    Host: test.com
    X-Forwarded-Host: #'></a><script>alert(1)</script>
    
  4. 响应变为:
    <a href='#'></a><script>alert(1)</script></a>
    

关键点

  • 测试时添加随机参数防止请求被缓存
  • 观察X-Cache头判断是否命中缓存

2.3 利用未键入Cookie的投毒

案例:利用fehost cookie

  1. 发现fehost cookie值会影响响应内容
  2. 构造payload:
    fehost=someString"%2Balert(1)%2B"someString
    
  3. 投毒根页面而非特定产品页面

2.4 利用多个标头的投毒

案例:组合X-Forwarded-Host和X-Forwarded-Scheme

  1. 使用Param Miner探测发现X-Forwarded-Scheme
  2. 结合X-Forwarded-Host一起使用
  3. 利用重定向漏洞:
    • 使页面重定向到攻击者控制的JS文件
    • 投毒/resources/js/tracking.js请求

2.5 有针对性的投毒

案例:利用X-Host头

  1. 发现X-Host是非缓存键
  2. 响应包Vary头包含User-Agent,说明UA是缓存键
  3. 通过留言板获取目标用户UA:
    
    
  4. 根据目标UA构造投毒请求

2.6 利用无键查询字符串

案例:参数不作为缓存键

  1. 发现改变参数不影响缓存匹配
  2. 构造XSS payload直接投毒主页
  3. 所有用户访问主页时都会触发恶意脚本

2.7 利用未键入查询参数

案例:utm_content参数

  1. 使用Param Miner探测发现utm_content是非缓存键
  2. UTM相关参数通常不作为缓存键
  3. 构造请求:
    GET /?callback=setCountryCookie&utm_content=;callback=alert(1)
    
  4. 响应包含恶意脚本但不会影响缓存匹配

2.8 参数隐藏技术

高级技巧

  1. 使用分号分隔多个参数
  2. 将恶意payload隐藏在非缓存参数的值中
  3. 确保主要缓存键保持不变

三、工具与技术

3.1 Param Miner插件

Burp Suite插件,用于:

  • 自动探测影响响应的header和参数
  • 识别非缓存键
  • 发现隐藏的参数依赖关系

使用方法:

  1. 右键请求包
  2. 选择"Guess headers"或"Guess parameters"
  3. 使用默认设置执行探测

3.2 缓存检测技巧

判断缓存命中的方法:

  1. 观察X-Cache头:miss表示未命中,hit表示命中
  2. 快速发送相同请求,比较响应时间
  3. 添加随机参数防止请求被缓存

3.3 防止请求被缓存

添加以下header可防止请求被缓存:

Cache-Control: no-store
Pragma: no-cache

四、防御措施

4.1 对开发者的建议

  1. 谨慎选择缓存键,确保安全相关参数包含在内
  2. 对动态内容谨慎使用缓存
  3. 避免根据用户输入直接生成页面内容
  4. 实施严格的输入过滤和输出编码

4.2 对管理员建议

  1. 配置缓存服务器忽略高风险header
  2. 限制可缓存的页面范围
  3. 实施缓存净化机制
  4. 监控异常的缓存命中模式

五、总结

WEB缓存投毒是一种危害严重的攻击技术,攻击者通过精心构造的请求污染缓存,影响大量用户。防御的关键在于正确配置缓存机制,严格区分缓存键和非缓存键,并对用户输入进行严格过滤。安全测试人员应掌握Param Miner等工具的使用,全面测试缓存相关漏洞。

WEB缓存投毒技术详解 一、WEB缓存投毒基础概念 1.1 什么是WEB缓存投毒 WEB缓存投毒是一种攻击技术,攻击者利用缓存机制将有害的HTTP响应提供给其他用户。当恶意响应被缓存后,所有访问相同资源的用户都会收到这个被污染的响应。 1.2 缓存工作原理 缓存机制的工作流程: 用户发起请求时,请求首先经过缓存服务器 如果缓存中存在匹配的响应,直接返回给用户 如果缓存中不存在,请求会被转发到后端服务器 后端服务器响应后,响应会被添加到缓存中 后续用户的等效请求将从缓存中获取响应 1.3 缓存键(Cache Key)与非缓存键 缓存键 :预先定义的请求头中的一些键作为缓存键,只要这些键的值相同,后端就认为两个请求是等效的 非缓存键 :请求头中除缓存键外的其他键,这些键的值不会影响缓存匹配 缓存投毒的关键在于利用非缓存键,因为: 缓存键通常不能改变,否则无法与其他用户等效 页面内容需要根据非缓存键的值动态生成 二、漏洞利用技术 2.1 基本利用条件 成功的WEB缓存投毒需要满足两个条件: 存在可被利用的非缓存键 页面内容会根据非缓存键的值动态生成 2.2 利用未键标头的投毒 案例 :利用X-Forwarded-Host头 使用Param Miner插件探测影响响应的非缓存键 发现X-Forwarded-Host影响页面内容 构造恶意请求: 响应变为: 关键点 : 测试时添加随机参数防止请求被缓存 观察X-Cache头判断是否命中缓存 2.3 利用未键入Cookie的投毒 案例 :利用fehost cookie 发现fehost cookie值会影响响应内容 构造payload: 投毒根页面而非特定产品页面 2.4 利用多个标头的投毒 案例 :组合X-Forwarded-Host和X-Forwarded-Scheme 使用Param Miner探测发现X-Forwarded-Scheme 结合X-Forwarded-Host一起使用 利用重定向漏洞: 使页面重定向到攻击者控制的JS文件 投毒/resources/js/tracking.js请求 2.5 有针对性的投毒 案例 :利用X-Host头 发现X-Host是非缓存键 响应包Vary头包含User-Agent,说明UA是缓存键 通过留言板获取目标用户UA: 根据目标UA构造投毒请求 2.6 利用无键查询字符串 案例 :参数不作为缓存键 发现改变参数不影响缓存匹配 构造XSS payload直接投毒主页 所有用户访问主页时都会触发恶意脚本 2.7 利用未键入查询参数 案例 :utm_ content参数 使用Param Miner探测发现utm_ content是非缓存键 UTM相关参数通常不作为缓存键 构造请求: 响应包含恶意脚本但不会影响缓存匹配 2.8 参数隐藏技术 高级技巧 : 使用分号分隔多个参数 将恶意payload隐藏在非缓存参数的值中 确保主要缓存键保持不变 三、工具与技术 3.1 Param Miner插件 Burp Suite插件,用于: 自动探测影响响应的header和参数 识别非缓存键 发现隐藏的参数依赖关系 使用方法: 右键请求包 选择"Guess headers"或"Guess parameters" 使用默认设置执行探测 3.2 缓存检测技巧 判断缓存命中的方法: 观察X-Cache头:miss表示未命中,hit表示命中 快速发送相同请求,比较响应时间 添加随机参数防止请求被缓存 3.3 防止请求被缓存 添加以下header可防止请求被缓存: 四、防御措施 4.1 对开发者的建议 谨慎选择缓存键,确保安全相关参数包含在内 对动态内容谨慎使用缓存 避免根据用户输入直接生成页面内容 实施严格的输入过滤和输出编码 4.2 对管理员建议 配置缓存服务器忽略高风险header 限制可缓存的页面范围 实施缓存净化机制 监控异常的缓存命中模式 五、总结 WEB缓存投毒是一种危害严重的攻击技术,攻击者通过精心构造的请求污染缓存,影响大量用户。防御的关键在于正确配置缓存机制,严格区分缓存键和非缓存键,并对用户输入进行严格过滤。安全测试人员应掌握Param Miner等工具的使用,全面测试缓存相关漏洞。