【Web安全】一文搞懂HTTP异步缓存攻击:原理、实战与防御
文章目录1 什么是异步缓存攻击2 攻击原理从缓存键的逻辑漏洞说起2.1 缓存服务器的核心规则缓存键2.2 后端服务的特殊逻辑2.3 攻击的核心两套逻辑的“错位”3 实战攻击方法一步步实现缓存投毒3.1 前期准备3.2 构造恶意请求3.3 投毒过程拆解3.4 攻击的核心优势4 防御方案4.1 规范缓存键配置4.2 严格校验请求头4.3 优化云存储的访问逻辑4.4 补充安全加固5 总结⚠️本博文所涉安全渗透测试技术、方法及案例仅用于网络安全技术研究与合规性交流旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前必须获得目标网络 / 系统所有者的明确且书面授权严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。1 什么是异步缓存攻击我们日常访问网站时CDN、缓存服务器这类中间服务会把网站的静态资源比如JS、CSS、图片缓存下来下次用户访问时直接返回缓存内容以此加快访问速度、减轻服务器压力。而异步缓存攻击就是利用缓存服务器和后端服务对请求头的解析逻辑不一致把恶意内容“投毒”到目标网站的缓存里。后续所有正常用户访问目标资源时都会拿到被篡改的恶意内容相当于给整个网站的用户“埋雷”而且一次投毒就能持续生效隐蔽性极强。2 攻击原理从缓存键的逻辑漏洞说起2.1 缓存服务器的核心规则缓存键缓存服务器不是随便缓存内容的它会用缓存键来区分不同的资源默认的缓存键由两部分组成资源的URL路径比如/static/a.js请求头里的Host字段比如xxx.com举个例子正常请求https://xxx.com/static/a.jsHost: xxx.com→ 缓存键是xxx.com /static/a.js缓存服务器存储正常的JS文件。攻击者修改Host为2026.target.com请求同一个URL → 缓存键变成2026.target.com /static/a.js缓存服务器会把这个请求当成全新的资源单独存储响应。2.2 后端服务的特殊逻辑很多云存储服务会用Host头来路由请求、定位存储桶而不是依赖请求的目标域名。比如你向A.s3.amazonaws.com发请求只要把Host头改成xxx.s3.amazonaws.comAWS就会直接把请求路由到xxx这个存储桶完全忽略你访问的原始域名。同时这类服务还有一个关键特性如果请求里有多个Host头只会取第一个剩下的全部忽略。2.3 攻击的核心两套逻辑的“错位”异步缓存攻击的本质就是利用缓存服务器和后端服务对Host头的解析不一致缓存服务器用第二个Host头生成缓存键把恶意内容存到目标网站的缓存条目里。后端服务用第一个Host头路由请求返回攻击者可控的恶意内容。两者的逻辑错位让攻击者可以把自己的恶意内容“挂”到目标网站的缓存上实现投毒。3 实战攻击方法一步步实现缓存投毒我们以存储桶CDN缓存的场景为例完整拆解攻击流程所有步骤都基于真实案例的逻辑3.1 前期准备攻击者自己注册一个存储桶比如attacker.s3.amazonaws.com在桶里上传一个恶意JS文件比如a.js内容可以是窃取用户Cookie的XSS代码。找到目标网站的静态资源入口比如https://target.com/static/a.js确认该资源会被CDN缓存。3.2 构造恶意请求攻击者向目标CDN缓存服务器发送一个包含两个Host头的请求GET /static/a.js HTTP/1.1 Host: attacker.s3.amazonaws.com Host: target.com ...其他正常请求头...3.3 投毒过程拆解请求到达CDN缓存服务器缓存服务器发现缓存里没有target.com /static/a.js的条目就把请求转发给后端S3服务。处理请求只读取第一个Host头attacker.s3.amazonaws.com把请求路由到攻击者的存储桶返回恶意的a.js内容。缓存服务器存储响应缓存服务器读取第二个Host头target.com用target.com /static/a.js作为缓存键把恶意JS内容存到缓存里。攻击生效后续所有正常用户访问https://target.com/static/a.js时缓存服务器直接返回被投毒的恶意JS用户的浏览器会执行这段恶意代码完成攻击。3.4 攻击的核心优势异步生效攻击者只需要发一次请求完成投毒不需要同步触发用户访问后续所有访问该资源的用户都会中招。隐蔽性强正常用户访问的是目标网站的正常域名不会察觉资源被篡改很难溯源攻击。影响范围广一次投毒可以影响所有访问该资源的用户甚至可以实现全网站的持久化XSS。4 防御方案针对异步缓存攻击核心防御思路就是消除缓存服务器和后端服务的解析逻辑差异具体可落地的方案如下4.1 规范缓存键配置这是最核心的防御手段缓存服务器/CDN禁止将用户可控的Host头纳入缓存键强制使用业务的固定域名作为缓存键的Host部分。比如不管请求里的Host头是什么缓存键的Host都固定为target.com从根源上避免攻击者篡改缓存键。4.2 严格校验请求头后端服务包括云存储网关、CDN回源节点拒绝包含多个Host头的请求直接拦截异常请求。对Host头做白名单校验只允许业务合法的域名通过拒绝所有未知、攻击者可控的Host值。4.3 优化云存储的访问逻辑给存储桶绑定自定义域名比如static.target.com禁止直接通过s3.amazonaws.com这类原生域名访问强制校验请求域名与存储桶的绑定关系。关闭存储桶的Host头路由功能让存储桶只能通过绑定的自定义域名访问避免攻击者用Host头跨桶访问。4.4 补充安全加固对缓存的静态资源做哈希完整性校验只有哈希值匹配的正常资源才会被缓存防止恶意内容被存储。开启CDN的缓存防投毒规则定期清理异常缓存条目监控缓存命中率的异常波动。5 总结异步缓存攻击本质上是一套“逻辑错位”的利用手段用缓存服务器和后端服务对Host头的解析差异实现恶意内容的缓存投毒最终影响所有正常用户。本文是「Web安全基础」系列内容点击专栏导航查看全部系列内容。