文章总结: Web缓存欺骗攻击是利用缓存服务器规则缺陷,构造特殊URL诱导缓存服务器将用户敏感页面误判为公共静态资源并缓存,进而窃取敏感信息的攻击方式。攻击者通过添加静态资源扩展名、使用特殊路径分隔符或利用服务器路径规范化等方式实现攻击。防御措施包括精准判定缓存资源、优化缓存键设计以避免多用户缓存共享、严格遵循源服务器缓存指令等。
综合评分: 91
文章分类: WEB安全,漏洞分析,渗透测试,解决方案
Web缓存欺骗攻击及防御
原创
dcnb
Web安全基础与实践
2025年11月19日 18:00
广东
Web Cache欺骗攻击则是攻击者利用缓存服务器的规则缺陷,构造特殊请求URL,诱导缓存服务器将用户的敏感页面(如个人信息页、账户详情页)误判为公共静态资源并缓存,进而通过访问缓存资源窃取敏感信息的攻击方式。
1、核心概念
1.1 Web缓存的定义
Web缓存(Web Cache)是Web服务架构中用于暂存客户端请求资源的中间组件,通过保存已响应的资源副本,当后续客户端发起相同请求时,直接从缓存返回资源,无需再次请求源服务器。如图1所示。
图1 web缓存机制图解
1.2缓存键
缓存键是缓存服务器用于唯一标识缓存资源的字符串,其核心作用是确保“相同请求对应相同缓存资源”,“不同请求对应不同缓存资源”,避免缓存混淆。当客户端发起请求时,缓存服务器会先根据请求信息生成缓存键,再查询缓存存储中是否存在该键对应的有效资源——若存在则“命中缓存”,直接返回;若不存在则“未命中缓存”,转发请求至源服务器,并将响应资源与缓存键关联后存储。
1.3缓存规则
缓存规则的核心作用是明确哪些内容可被缓存及缓存内容的有效时长。
从缓存对象来看,规则通常优先将静态资源纳入缓存范围。这类资源的特点是内容更新频率低(如样式表、脚本文件、图片),且会在多个页面中重复引用),缓存后能显著减少服务器重复请求、提升客户端加载速度。与之相对,动态内容通常被排除在缓存外,原因在于其内容可能包含用户敏感信息,且需实时从服务器获取最新数据,若缓存可能导致信息泄露或数据滞后。
从具体规则类型来看,基于请求特征的规则最为常见,尤其是与URL路径字符串相关的规则,主要包括三类:
一是静态文件扩展名规则,通过匹配请求资源的文件后缀来判定是否缓存,例如默认对后缀为.css(样式表)、.js(脚本)、.png(图片)、.jpg(图片)的资源触发缓存,这类后缀直接关联静态资源类型;
二是静态目录规则,通过匹配URL路径的特定前缀来锁定缓存范围,例如对以/static/、/assets/、/images/开头的URL路径下所有资源进行缓存,这类目录通常是开发者预设的静态资源存放位置;
三是文件名规则,针对部分全网通用且极少更改的特定文件单独设置缓存。
2、攻击原理
Web缓存欺骗攻击的核心原理,是利用缓存服务器仅依据URL表面的静态资源特征(如.css.js等文件扩展名、/static//assets/等预设静态目录前缀)判定是否缓存,却未验证资源实际内容类型的规则缺陷,这些缺陷为Web缓存欺骗攻击提供了可乘之机,使得攻击者能构造欺骗URL,诱导缓存服务器将本应禁止缓存的敏感动态页面误判为公共静态资源缓存,最终导致信息泄露。
3、一般攻击步骤的构建
3.1构造恶意URL
攻击者首先创建一个带有恶意内容的URL,该URL可能指向不存在的文件或其他类型的资源。
3.2诱导访问
攻击者通过多种途径(如钓鱼邮件、恶意链接等),引导处于登录状态的用户点击并访问这个恶意URL。
3.3缓存欺骗
当受害者用浏览器请求该恶意URL时,Web服务器可能会返回包含受害者敏感信息的页面(如账户信息页面)。由于缓存服务器被配置为缓存所有静态文件,或会忽略缓存头部信息,这个含敏感信息的页面便有可能被缓存。
3.4传播恶意内容
当其他用户请求相同的URL时,缓存服务器会将之前缓存的恶意页面返回给这些用户,从而实现恶意内容的传播。如图2所示。
图2 攻击示例
4、具体实验案例
本操作文档以Windows10攻击机上结合Burp Suite为例进行基本的Web欺骗攻击的四种实验演示。
4.1利用路径映射进行Web缓存欺骗
首先利用给定的测试账号登录后,我们可以看到相应的API Key,如图3所示。
图3 登陆界面的API Key
抓包后找到刚刚登录后访问GET/my-account的请求,进入Repeater标签,将URL路径修改为/my-account/web,发送请求,可以观察到响应中仍包含wiener的APIKey,如图4所示。
图4 服务器忽略额外路径图示
将URL路径修改为/my-account/web.js,重新发送请求,可以观察到响应头出现X-Cache:miss和Cache-Control:max-age=30,如图5所示。
图5 添加静态扩展名,测试缓存行为
再次发送请求,可以观察到响应头中的X-Cache变为hit,说明缓存服务器已将/my-account/web.js当作“静态资源”缓存——第二次请求直接从缓存返回响应,如图6所示。
图6 缓存生效图示
在Burp浏览器的攻击服务器中,输入以下html代码:后,在新的标签页输入构造的恶意URL,就得到了用户的API Key,如图7,图8所示。
图7 构造恶意URL
图8 结果展示
4.2利用路径分隔符进行Web缓存欺骗
首先按照实验一的方法在/my-account后添加任意字符,观察到404响应且无缓存痕迹,如图9所示。
图9 基础测试结果
然后进入「Intruder」面板,确认攻击类型为「Sniper」,在路径中设置payload位置:将路径改为/my-account§§web,添加可能的分割符后进行攻击,可以观察到仅字符;和?能让请求返回200状态码,其余均返回404,如图10所示。
图10 攻击结果
返回Repeater面板,将路径改为/my-account;web.js,可以观察到第一次发送请求:响应头出现X-Cache:miss,第二次发送请求:响应头变为X-Cache:hit,说明缓存已命中,后续请求将从缓存返回。如图11,图12所示。
图11 第一次请求
图12 第二次请求
在Burp浏览器的攻击服务器中,输入以下html代码:后,在新的标签页输入构造的恶意URL,就得到了用户的API Key,如图13所示。
图13 实验结果
4.3利用源服务器规范化进行Web缓存欺骗
按照实验二的攻击步骤进行测试,发现仅包含?分隔符的请求返回200,但发送请求,观察响应头:无X-Cache相关字段(或无缓存标记),说明缓存也将?视为分隔符,如图14所示。
图14 测试结果
在Repeater中修改请求路径为/web/..%2f/my-account,可以观察到响应状态码为200,且包含wiener的API Key,如图15所示。
图15 测试源站路径规范化
筛选路径包含/resources的请求(/resources/js/tracking.js),观察到响应头有X-Cache字段,修改路径为/resources/..%2f/web,第一次发送请求,响应为404,响应头含X-Cache:miss,再次发送请求,响应仍为404,但响应头变为X-Cache:hit,说明/resources前缀的路径会被强制缓存,且缓存不解析..%2f。如图16所示。
图16 确认/resources目录的缓存规则
在Repeater中修改路径为/resources/..%2f/my-account,发送请求后,第一次响应为200,含wiener的APIKey,响应头X-Cache:miss,第二次响应返回200,响应头X-Cache:hit,说明敏感页面/my-account被当作/resources下的静态资源缓存,如图17所示。
图17 构造恶意路径请求返回结果
同样在攻击服务器中属于以下html代码,,攻击后在新建标签页中输入恶意URL,就得到了用户的API Key,如图18所示。
图18 攻击结果
4.4利用缓存服务器规范化进行Web缓存欺骗
按照实验二的攻击步骤进行测试,发现仅包含#、?、%23、%3f对应的请求返回200,如图19所示。
图19 分隔符测试结果
找到一个/resources前缀的请求,修改路径为/web/..%2fresources/js/main.js,发送两次请求,可以观察到第二次发送后缓存命中,说明缓存服务器会解析编码点段,且仅对/resources前缀的路径触发缓存。如图20所示。
图20 缓存服务器的路径规范化规则测试结果
在Repeater中,基于/my-account构造路径:/my-account%23%2f%2e%2e%2fresources,发送请求,可以观察到缓存命中,如图21所示。
图21 构造恶意URL
同样,使用如下html代码构造恶意URL:,在新建标签页中访问即可得到目标用户的API Key,如图22所示。
图22 目标用户的APIKey
5、防御措施
综合上述实验结果,我们可以从三个维度来构建web缓存欺骗的防御体系:
5
5.1精准判定缓存资源,杜绝URL特征误判
本维度通过解决“过度依赖URL表面特征”的缺陷,建立“URL特征+内容类型+资源属性”的三重判定机制:
如缓存服务器优先依据响应内容类型(Content-Type)判定是否缓存,仅对明确的静态资源类型(如text/css、application/javascript、image/png)开启缓存,拒绝缓存text/html等动态页面类型;
如果需要基于URL配置缓存规则,应该添加“路径有效性校验”,禁止缓存包含动态参数(如uid、token)或异常路径(如../、编码字符)的URL。
5.2优化缓存键设计,避免多用户缓存共享
本维度的核心是解决“缓存键缺失用户标识”的问题,确保不同用户的动态内容生成独立缓存:
缓存键必须包含用户专属标识,如会话ID($cookie_phpsessid)、用户Token哈希值等,实现“一人一缓存”;
针对无需登录的公共静态资源(如网站图标、通用样式),可单独配置简化缓存键(不含用户标识。
5.3严格遵循源服务器缓存指令,杜绝规则优先级倒置
核心确保缓存服务器尊重源服务器的缓存策略,避免强制缓存敏感页面:
将源服务器Cache-Control响应头指令的优先级设为最高,严格执行no-store(禁止任何缓存)、private(仅客户端缓存)等指令;
敏感页面(如登录页、账户详情页、订单页)必须在源服务器端添加强制禁止缓存的响应头;
缓存服务器配置中禁用“强制缓存所有XX类型URL”的宽松规则,避免覆盖源服务器的禁止指令。
本文由杨昊文同学投稿。
- END –
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Web安全基础与实践 dcnb《Web缓存欺骗攻击及防御》