缓存投毒之CPDOS
字数 1764 2025-08-22 18:37:14
Web缓存投毒攻击(CPDoS)深度解析与实战教学
一、缓存投毒概述
缓存投毒(Web Cache Poisoning)是一种利用Web缓存机制漏洞的攻击手段,攻击者将恶意数据注入缓存系统,导致其他用户访问相同资源时接收到被篡改的内容。这种攻击可导致多种危害:
- 拒绝服务(DoS)
- 跨站脚本攻击(XSS)
- 恶意重定向
- 数据泄露
CPDoS(Cache-Poisoned Denial-of-Service)是2019年提出的针对Web缓存系统的特殊攻击类型,利用缓存系统与源服务器处理HTTP请求的差异,导致缓存错误响应页面,引发拒绝服务。
二、HTTP请求头溢出(HHO)攻击
原理
利用CDN/代理与后端服务器对HTTP请求头大小限制的差异:
- 服务器限制(如Apache):~8,192字节
- CDN限制(如Cloudfront):可达20,480字节
当攻击者发送介于两者之间的请求头时:
- CDN正常处理请求
- 后端服务器返回异常(如400错误)
- CDN缓存此异常响应
- 后续用户请求都收到错误响应
实战案例
案例1:云点播服务漏洞
- 缓存键:任意GET参数
- 后端对超大请求返回400状态码
- CDN配置为缓存400响应3秒
- 攻击效果:每3秒发送一次恶意请求,可维持持续拒绝服务状态
案例2:无缓存键目标的攻击
- 目标缓存过期时间极短(30秒)
- 在缓存失效瞬间发送恶意请求
- 攻击效果:所有用户请求都收到400错误响应
- 风险:可能影响正常业务(Bugcrowd评级P4,赏金$850)
三、HTTP方法覆盖(HMO)攻击
原理
利用Web框架提供的特殊请求头绕过中间设备限制:
- 常见中间设备(负载均衡器、WAF等)通常只允许GET/POST方法
- Web框架提供覆盖头:
X-HTTP-Method-OverrideX-HTTP-MethodX-Method-Override
攻击流程
- 攻击者添加方法覆盖头(如
X-HTTP-Method-Override:POST) - CDN/代理将请求方法重置为POST转发给后端
- 目标接口不支持POST方法,返回400错误
- CDN缓存错误响应
- 维持攻击:每3秒发送一次恶意请求
四、HTTP重定向DoS攻击
原理
通过缓存恶意重定向响应,导致用户陷入无限重定向循环或访问不存在的资源。
实战案例
案例1:参数差异利用
- 缓存键:Origin请求头
- 发现特殊参数
page:- 无值时:301跳转并在Location中添加
?page - 有值时:不添加到Location
- 无值时:301跳转并在Location中添加
- 攻击效果:请求
/被重定向到/?page,形成无限循环
案例2:Accept-Language头利用
- 缓存键:Accept-Language请求头
- GET参数不是缓存键
- 发现:
- 默认请求301跳转到
/en/ - GET参数会跟随跳转并URL解码
- 传递非法参数可导致500错误
- 默认请求301跳转到
- 攻击效果:构造恶意请求导致持续错误(赏金$2900)
五、黑名单缓存投毒
原理
利用目标站点对特定User-Agent的黑名单机制:
- 当UA被识别为扫描器/爬虫时返回异常
- 攻击者伪造此类UA使异常响应被缓存
- 后续合法用户请求也收到错误响应
六、畸形HOST头攻击
实战案例
- 缓存键:仅Lang GET参数
- 攻击构造:
https://xxxx.com?Lang=11111111 - 效果:目标无限跳转到自身URL,导致拒绝服务
- 赏金:1000欧元
七、其他可疑请求头攻击
除上述类型外,还需注意:
MAX-forwardsif-modified-since- 其他业务相关的自定义头
八、防御措施
- 严格配置缓存键:只包含必要的参数/头
- 统一请求处理规范:确保CDN与后端一致
- 限制缓存错误响应:避免缓存4xx/5xx状态码
- 请求头大小限制:前后端保持相同限制
- 方法过滤:严格限制支持的HTTP方法
- 黑名单策略优化:避免可预测的拦截行为
九、检测工具
推荐使用wcpvs工具进行自动化检测,支持多种缓存投毒漏洞类型的扫描。
本教学文档涵盖了CPDoS攻击的主要类型、原理和实战案例,重点突出了各种攻击手法的技术细节和实际应用场景。在实际渗透测试中,应特别注意缓存键的识别和异常响应的缓存行为分析,这是发现缓存投毒漏洞的关键所在。