缓存投毒之CPDOS
1760657543503061 发表于 天津 渗透测试 1629浏览 · 2024-08-31 19:57

前言

自从James Kettle在2018年发布了一篇介绍缓存投毒的论文以来,缓存投毒逐渐引起了广泛关注。虽然截至2024年,缓存投毒技术已经相对成熟且不再新鲜,但在国内的关注度似乎仍然较低。为此,笔者开发了一款用于检测各种类型缓存投毒漏洞的工具,详见 wcpvs 仓库。本文将详细介绍该工具在扫描CPDOS缓存投毒漏洞中的应用,后面应该还会有一篇其他漏洞和缓存投毒结合的文章。

缓存投毒

缓存投毒(Web Cache Poisoning)是一种网络安全攻击手段,它利用了Web缓存机制中的漏洞,将恶意数据存储到缓存中,从而使得其他访问相同资源的用户接收到被篡改的内容。这种攻击可以用于多种恶意目的,包括但不限于拒绝服务、跨站脚本攻击(XSS)、重定向攻击、数据泄露等。缓存投毒绝不是一个理论上的漏洞,而是真实存在并可以被利用的。随着网站越来越依赖于复杂的服务器堆栈和辅助系统,其安全状况也越来越难以单独评估。下面将使用一些例子来介绍关于缓存投毒的相关技术。

CPDOS

缓存投毒导致的拒绝服务 (CPDoS) ,是 Hoai Viet Nguyen, Luigi Lo Iacono, and Hannes Federrath 在2019年在第 26 届 ACM 计算机和通信安全会议 (CCS) 2019 发布的针对缓存投毒攻击的研究。

CPDoS(Cache-Poisoned Denial-of-Service)攻击是一种针对Web缓存系统的攻击手段,其核心原理是利用缓存系统与源服务器在处理HTTP请求头部大小时的差异,导致缓存系统中存储了错误的响应页面,从而引发拒绝服务。

HTTP 请求头溢出(HHO)

原理:

HTTP 请求头溢出技术,顾名思义,是超出请求头的最大限制,但是在HTTP 标准中并没有规定此项,所以所谓的HTTP 请求头大小限制,都是服务器或者框架自己定义的,初衷是用来加快请求速度和防止一些过大的请求头而导致的拒绝服务攻击,但是CDN和服务器对请求头大小的处理差异导致了CPDOS漏洞的产生,例如,Apache HTTPD等服务器和代理设定了大约8,192字节的限制,而Amazon Cloudfront CDN允许的头部大小可达到20,480字节。如果攻击者发送一个超过8192字节但是又小于20480字节大小的请求头,CDN会正常处理,但是服务器返回异常,而CDN又缓存了这个异常。

漏洞样例1:

某云点播服务,缓存键为任意GET参数,因为CDN和后端服务器对请求头大小的限制不同,并且后端服务对于超过最大请求的响应状态码是400,而CDN又配置400状态码缓存3S。

如果攻击者指定某缓存键每3秒发送一次恶意数据包,指定缓存键的请求总是会被CDN缓存,而用户的请求的响应也总是400。

漏洞样例2

这个漏洞是一个比较有意思的缓存投毒,因为目标没有缓存键,比较熟悉缓存投毒漏洞的师傅应该比较清楚缓存键在验证缓存投毒漏洞中的重要性,但是这个目标的缓存过期时间很短是30秒,所以我们可以利用在缓存过期的一瞬间发送恶意请求,以验证目标是否存在缓存投毒漏洞,但是此方法比较危险,会影响正常业务的进行。

可以看到错误响应已经被缓存,后面每一个用户的请求都是响应400。

其他地区主机验证。

Bugcrowd 给了P4评级和850美元的赏金。

HTTP 方法覆盖 (HMO)

原理

在HTTP标准文档中,定义了多种方法供客户端和服务器进行不同类型的通信。然而,许多网络应用仅允许使用POST和GET方法,例如负载均衡器、代理、缓存和WAF等设备。这意味着这些设备后的服务无法接收到DELETE和PUT等方法的请求,这对基于REST的应用程序和某些Web框架来说可能是灾难性的。
因此,许多Web框架和基于REST的应用程序通过提供X-HTTP-Method-Override、X-HTTP-Method或X-Method-Override头来转发非GET和POST的请求,以绕过上述设备的限制。HMO技术利用这些请求头,转发一些不被允许的请求,导致后端响应错误,从而实现缓存投毒。

漏洞样例:

在请求中添加 X-HTTP-Method-Override:POST 头,CDN或者代理收到此请求后会将转发给后端的请求重置为POST方法,但是此接口又不支持POST请求,所以响应400错误,然后CDN又将错误页面缓存。


每3秒发送一次恶意请求,可以做到持续缓存投毒。


正常请求页面,响应同样是400错误。


低危评级。

HTTP 重定向DOS

原理

HTTP 重定向 DOS(Denial of Service)攻击是缓存投毒的一种变种,通过将合法请求的响应重定向到恶意或不存在的资源,导致用户无法访问正常服务,或陷入循环重定向的状态,从而造成服务拒绝。也有可能是CDN或其他缓存服务与源站对请求包大小不一致导致的拒绝服务。

漏洞样例1

wcvps 仅扫描到一个请求头缓存键Origin。


没有其他的投毒类型,只能看下参数差异。


上图可以看到一个比较有意思的参数,page发送这个参数会301跳转,但是呢,这个参数不能有值,有值的话Location里面不是有这个参数,只有无值的page参数才会添加到Location参数里面。


因为GET参数又不是缓存键,所以现在请求 https://www.target.com/ 也是会响应我们之前缓存的响应,也就是301跳转到 https://www.target.com/?page 因为GET不是缓存键,所以就导致了无限跳转,响应失败。

漏洞样例2

目标默认请求响应是301,跳转到/en/,并且存在缓存机制。


缓存键是 Accept-Languge 请求头。


并且GET参数不是缓存键,这点很重要,基本也是重定向缓存投毒类型的核心因素。


从下图中可以看到GET参数会跟随跳转,并且会URL解码,由此我们可以猜想,跳转后的的那个页面会不会也做URL解码呢?如果存在URL解码机制的话,那么传一个不合法的参数会不会报错呢?


可以看到,传递一个不合法的GET参数,确实会导致500错误。


本漏洞也为我赢了2900美元的奖励。

黑名单缓存投毒

原理

黑名单缓存投毒(Blacklist Cache Poisoning)是一种利用缓存服务器黑名单策略的漏洞来注入恶意数据的攻击手法。攻击者通过伪造响应,诱使缓存服务器将合法的请求响应与黑名单中的恶意内容关联,从而污染缓存。这类攻击会导致缓存服务器在一段时间内持续返回被投毒的内容,给用户带来安全风险或服务中断。

漏洞样例

目标站点会检测UA的值,如果UA的值为扫描器或者爬虫,目标就会拒绝为其服务,响应异常状态码。

畸形HOST头

原理

畸形 HOST 头攻击是一种通过篡改 HTTP 请求中的 HOST 头字段来实现缓存投毒、绕过认证、或进行钓鱼攻击的手法。这类攻击通常利用服务器或应用程序对 HOST 头处理不当的漏洞,导致错误解析和响应行为,从而使攻击者达成其目的。

漏洞样例:

此目标的缓存键只有一个Lang的GET参数,所有发现缓存投毒漏洞,寻找缓存键至关重要。可以看到
https://xxxx.com?Lang=11111111已经被缓存了,但是目标依旧是跳转到https://xxxx.com?Lang=11111111,所以就是无限跳转,导致拒绝服务。

此漏洞为我赢得了一千欧的赏金奖励。

任何可疑的请求头

其实不仅仅上述介绍的几种请求头投毒方式,因为各个网站的业务不同,会有很多请求头类型可能会遭到投毒攻击,所以本文所介绍的工具会检测大部分可疑的请求头。

漏洞样例

MAX-forwards:


if-modified-since:

1 条评论
某人
表情
可输入 255