PortSwigger Web Cache 投毒攻击
字数 1592 2025-08-12 11:33:58

Web Cache 投毒攻击全面解析

0x01 前言

Web Cache Poisoning(Web缓存投毒)是一种辅助性攻击手段,地位高于CORS,低于CSRF。它在很多知名网站(如Google、百度、msn、必应等)中都存在潜在隐患。

0x02 基本概念

1. 什么是Web Cache

Web Cache位于服务器和用户之间,保存对特定请求的响应。当另一个用户发送等效请求时,Web Cache直接将缓存的响应副本提供给用户,无需后端交互,从而减轻服务器负载。

2. Web Cache Poisoning原理

攻击者触发服务器缓存附有恶意Payload的响应,当其他用户发送相同请求时即会接收到这个恶意响应。相比针对单个用户的攻击,Web Cache Poisoning可以影响大量用户。

3. 缓存键(Cache Key)

Web Cache通过比较请求组件的预定义子集(缓存键)来标识等效请求。一般缓存键包括Request Header和Host头。服务器只识别设置为缓存键的特征是否相同,这导致了Web缓存投毒漏洞的产生。

0x03 Web Cache Poisoning攻击思路

  1. 找出未被Web Cache缓存的输入:如GET请求中的某些参数
  2. 从后端服务器诱发被投毒的响应
  3. 得到被缓存的响应

0x04 基于缓存设计缺陷的攻击

1. 使用Web Cache Poisoning扩大XSS战果

示例

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

利用步骤

  1. 使用Param Miner插件扫描可用的未缓存字段
  2. 发现X-Forwarded-Host头可用
  3. 构造XSS Payload并多次发送使缓存生效
  4. 其他用户访问时会触发XSS

2. 对不被缓存的Cookie进行投毒

示例

GET /blog/post.php?mobile=1 HTTP/1.1
Host: innocent-website.com
Cookie: language=pl;

利用方法

  • 修改Cookie中不被缓存的字段值影响其他用户

3. 使用多个HTTP Header发起攻击

示例

GET /random HTTP/1.1
Host: innocent-site.com
X-Forwarded-Proto: http
X-Forwarded-Host: evil.com

4. 通过Cache-Control导致信息泄露

  • 利用Vary头和Cache-Control头获取缓存信息
  • 通过User-Agent等字段针对特定用户群投毒

5. 对DOM型漏洞进行Web Cache投毒

特点

  • 通过缓存投毒导入恶意JSON字符串
  • 需要CORS授权允许跨站

6. Web Cache完整投毒过程

综合步骤

  1. 使用Param Miner探测可用字段
  2. 分析响应中可控部分
  3. 构造DOM型XSS Payload
  4. 通过多个字段组合实现投毒

0x05 基于Cache Key缺陷的攻击

1. 通过未被缓存的端口进行攻击

  • 缓存键可能只缓存域名不缓存端口号
  • 可导致DDOS或XSS攻击

2. 通过未被缓存的查询字符串攻击

示例

/?evil='/><script>alert(1)</script>

3. 仅有几个不被缓存的查询参数时

  • 需要进行Fuzz测试找出可用参数
  • utm_content参数常可用

4. 利用多个参数实现缓存参数隐藏

示例

GET /?example=123?excluded_param=bad-stuff-here
  • 第二个问号后的参数不会被作为缓存键处理

5. 利用Fat GET请求发起攻击

特点

  • GET请求中在HTTP Body也携带参数
  • Body中的参数可能覆盖URL中的参数

6. 利用资源导入中的动态内容进行攻击

示例

GET /style.css?excluded_param=123);@import...

7. 缓存解析URL编码的隐患

  • 缓存会自动进行URL解码
  • 可绕过某些XSS过滤

8. 缓存键注入

特点

  • 使用双下划线(__)分隔不同字段
  • 使不同请求被识别为等效请求

9. 内部缓存投毒

  • 类似于CSRF的攻击方式
  • 不需要先找不被键入的参数

0x06 防御措施

  1. 严格安全防护,尽量使用静态响应
  2. 对导入资源进行严格校验
  3. 禁止模棱两可的请求方法(如Fat GET)
  4. 禁用不需要的HTTP头字段

0x07 总结

Web Cache Poisoning是一种强大的辅助攻击手段,能够扩大其他漏洞的影响范围。攻击者需要深入了解缓存机制和网站实现细节,防御者则需要全面考虑缓存设计的各个方面。

Web Cache 投毒攻击全面解析 0x01 前言 Web Cache Poisoning(Web缓存投毒)是一种辅助性攻击手段,地位高于CORS,低于CSRF。它在很多知名网站(如Google、百度、msn、必应等)中都存在潜在隐患。 0x02 基本概念 1. 什么是Web Cache Web Cache位于服务器和用户之间,保存对特定请求的响应。当另一个用户发送等效请求时,Web Cache直接将缓存的响应副本提供给用户,无需后端交互,从而减轻服务器负载。 2. Web Cache Poisoning原理 攻击者触发服务器缓存附有恶意Payload的响应,当其他用户发送相同请求时即会接收到这个恶意响应。相比针对单个用户的攻击,Web Cache Poisoning可以影响大量用户。 3. 缓存键(Cache Key) Web Cache通过比较请求组件的预定义子集(缓存键)来标识等效请求。一般缓存键包括Request Header和Host头。服务器只识别设置为缓存键的特征是否相同,这导致了Web缓存投毒漏洞的产生。 0x03 Web Cache Poisoning攻击思路 找出未被Web Cache缓存的输入 :如GET请求中的某些参数 从后端服务器诱发被投毒的响应 得到被缓存的响应 0x04 基于缓存设计缺陷的攻击 1. 使用Web Cache Poisoning扩大XSS战果 示例 : 利用步骤 : 使用Param Miner插件扫描可用的未缓存字段 发现X-Forwarded-Host头可用 构造XSS Payload并多次发送使缓存生效 其他用户访问时会触发XSS 2. 对不被缓存的Cookie进行投毒 示例 : 利用方法 : 修改Cookie中不被缓存的字段值影响其他用户 3. 使用多个HTTP Header发起攻击 示例 : 4. 通过Cache-Control导致信息泄露 利用 Vary 头和 Cache-Control 头获取缓存信息 通过 User-Agent 等字段针对特定用户群投毒 5. 对DOM型漏洞进行Web Cache投毒 特点 : 通过缓存投毒导入恶意JSON字符串 需要CORS授权允许跨站 6. Web Cache完整投毒过程 综合步骤 : 使用Param Miner探测可用字段 分析响应中可控部分 构造DOM型XSS Payload 通过多个字段组合实现投毒 0x05 基于Cache Key缺陷的攻击 1. 通过未被缓存的端口进行攻击 缓存键可能只缓存域名不缓存端口号 可导致DDOS或XSS攻击 2. 通过未被缓存的查询字符串攻击 示例 : 3. 仅有几个不被缓存的查询参数时 需要进行Fuzz测试找出可用参数 如 utm_content 参数常可用 4. 利用多个参数实现缓存参数隐藏 示例 : 第二个问号后的参数不会被作为缓存键处理 5. 利用Fat GET请求发起攻击 特点 : GET请求中在HTTP Body也携带参数 Body中的参数可能覆盖URL中的参数 6. 利用资源导入中的动态内容进行攻击 示例 : 7. 缓存解析URL编码的隐患 缓存会自动进行URL解码 可绕过某些XSS过滤 8. 缓存键注入 特点 : 使用双下划线(__ )分隔不同字段 使不同请求被识别为等效请求 9. 内部缓存投毒 类似于CSRF的攻击方式 不需要先找不被键入的参数 0x06 防御措施 严格安全防护,尽量使用静态响应 对导入资源进行严格校验 禁止模棱两可的请求方法(如Fat GET) 禁用不需要的HTTP头字段 0x07 总结 Web Cache Poisoning是一种强大的辅助攻击手段,能够扩大其他漏洞的影响范围。攻击者需要深入了解缓存机制和网站实现细节,防御者则需要全面考虑缓存设计的各个方面。