相反,攻击者可以利用已经纳入缓存键计算的字段发起攻击:当Web服务器直接拼接这些字段、不设置明确分隔符时,就会出现漏洞。Web缓存的核心作用是存储已返回的响应内容,后续请求生成相同缓存键时,就直接返回存储的响应,以此提升访问性能。
以Nginx为例,缓存键通常由HTTP请求的多个部分拼接生成,包括协议类型、主机名、URI、查询字符串、Cookie或请求头字段。
常见的Nginx缓存键配置类似如下形式:

这类配置的核心问题在于,所有可变的请求组成部分会被直接拼接在一起。如果字段之间没有设置分隔符,两个完全不同的请求就可能生成完全相同的最终缓存键。

构造缓存键碰撞可绕过访问控制,窃取受限数据并投毒站点
举例来说,用户对路径/home发起合法请求,携带Accept: /请求头,生成的缓存键可能与攻击者构造的请求完全一致:攻击者仅请求路径/h,同时将剩余的“ome/”字符串放在自己可控的Accept头字段中。 虽然两个请求访问的路径完全不同,但Nginx拼接字段值后,会将它们判定为同一个缓存对象。这种碰撞漏洞允许攻击者提前构造请求,将恶意响应存入缓存,后续其他用户发起的合法请求只要匹配到同一个缓存键,就会收到攻击者存入的恶意响应。
研究人员演示的第一种攻击影响,是绕过权限控制访问受限端点,比如管理员路径/admin。在PoC中,Nginx原本仅允许本机localhost访问管理面板,同时其缓存键采用自定义配置,由请求URI和Accept头拼接生成。

CPDoS攻击流程(来源:yeswehack)
管理员从本机访问/admin页面时,会将正常的管理面板响应存入缓存。外部攻击者本来无法直接请求/admin路径,但可以构造请求访问其他路径(比如/ad),同时将路径剩余的“min”字符串放在自己可控的请求头字段中。 如果攻击者构造的请求与/admin路径生成的缓存键完全相同,服务器就不会再校验受保护路径的原有访问规则,直接返回之前缓存的管理面板响应。这种攻击属于Web缓存欺骗的一种,且无需受害者click恶意构造的链接。
这种技术还可以发起缓存投毒拒绝服务攻击,即CPDoS。攻击者可以先请求一个不存在的资源(比如/h),同时操纵可控的请求头字段。这种构造方式可以让请求生成的缓存键,与正常/home路径的缓存键发生碰撞。 攻击者的请求会让服务器返回404 Not Found响应,并将该响应存入缓存。后续用户访问正常的/home页面时,就会收到被投毒的错误响应,直到缓存过期或被手动清理。
Alex Brumen还演示了一种危害更严重的攻击场景,涉及HTTP与HTTPS协议字段混淆。如果Nginx的缓存键以$scheme$host$request_uri的格式拼接,攻击者可以通过HTTP发起请求,将HTTPS末尾的字母s拆分到恶意构造的Host头值中。 举例来说,攻击者通过HTTP发起请求,使用的Host值为sdummywebsite.localhost,生成的缓存键会与用户通过HTTPS正常访问dummywebsite.localhost生成的缓存键完全一致。 如果后端服务会将Host值回显到页面的脚本源地址中,被投毒的缓存页面就会从攻击者控制的域名加载JavaScript,最终导致存储型跨站脚本攻击。

Nginx将攻击者响应存入碰撞缓存键(来源:yeswehack)
Cloudflare+Nginx架构存利用空间,攻击者可投毒源站缓存
研究还测试了Nginx源站缓存前端部署Cloudflare的场景。攻击者可以在请求中携带Authorization头,让Cloudflare绕过自身的边缘缓存,直接将请求转发给后端Nginx源站。 如果Nginx源站仍然缓存了该恶意请求的响应,攻击者就可以直接投毒内部源站缓存。后续用户发起请求时,尤其是Cloudflare边缘缓存的对应条目过期或不存在时,就会从Nginx源站获取到被投毒的缓存响应。

Cloudflare可向未授权请求返回缓存响应(来源:yeswehack)
修复需为缓存键添加明确分隔符,配套加固缓存安全配置
这类漏洞的核心修复方式,是避免直接拼接无边界的原始缓存键片段。直接哈希存在歧义的缓存键无法解决问题,因为两组不同的请求组合仍然可能生成完全相同的原始字符串,哈希后的值依然会碰撞。
管理员应停止使用如下无分隔符的配置: proxy_cache_key "$scheme$host$request_uri$http_accept"; 转而使用明确的分隔符或结构化编码格式,例如: proxy_cache_key "$scheme|$host|$request_uri|$http_accept";
企业还应采取其他加固措施:不要在共享缓存中存储需要鉴权或访问控制的响应;严格校验Host头合法性;将HTTP流量强制跳转至HTTPS;确保CDN层与源站层的缓存行为逻辑一致。
本次研究结果表明,不能因为缓存键由合法请求字段生成,就默认其安全可靠。如果字段之间没有明确边界,攻击者可控的字段值就可以与合法请求生成缓存键碰撞,将原本用于提升性能的缓存功能,转化为数据泄露、网站篡改或拒绝服务的安全风险。


