1165 字
6 分钟
WEB缓存投毒练习

2.cookie 注入

题目提示 cookie 未被纳入缓存键存在注入

修改 fehost ,在代码中搜索发现的确影响了响应内容

查看原本的 js 结构,先破坏原本结构,在构造合法的 js 代码,不能直接拼接”alert(1)“,这不是合法的代码结构,后端不会去解析

3.多个请求头联合注入

题目说明要使用多个请求头才能完成任务

使用了几个请求头都发现没卵用

查看提示要使用X-Forwarded-Host and X-Forwarded-Scheme

x-forwarded-scheme 请求头表明要使用哪种协议来进行连接,如使用 http 还是 https,在这个实验中使用的是 https 连接,使用该请求头将协议改为非 https 连接会触发重定向

同时通过 x-forwarded-host 控制访问的主机地址,将其改为攻击者掌控的主机,同时在对应路径下写入攻击 代码

4.利用 vary 头进行定向缓存投毒

利用插件自动进行 unkeyed 请求头的寻找

发现可能存在 x-host,origin,via,进一步进行测试,只有 x-host 能影响相应内容

利用 x-host 来进行缓存投毒

同时题目需要对指定用户群体进行定向投毒,在评论中插入 js 代码,在服务器上查看哪些用户访问了评论

利用 vary 头指定 user-agent 纳入缓存键

同时将 user-agent 改为指定用户

5.通过未加密的查询字符串进行投毒

在原界面添加查询语句并多次修改其取值,发现每次都显示缓存命中,说明未纳入缓存键

在响应中搜索查询语句,发现被拼接在代码中,说明对响应产生影响

所以可进行缓存投毒

观察代码结构进行注入

6.参数伪装

依旧相同步骤,但是发现查询语句被纳入了缓存键,改变查询参数不会返回相同界面

开始使用?连接多个查询参数,用;&等分隔符都不行,查看提示说忽略了某个 utm 参数,beyond

utm 用来跟踪网站流量的来源、媒介和活动,衡量不同渠道和广告的效果

先把 utm 参数都填上去,一个个试发现 utm-content 参数未被纳入缓存键

本来想利用 utm_content 传 js 代码,但是发现会被实体转义,尝试了绕过也不行

试了半天也不行,还是只能看题解,发现要利用一个响应中的 js 文件请求,总是会忽略掉这种请求,请求的参数中利用了回调函数 callback,可以用这个来执行我们需要的 js 代码

查询参数 callback 是被纳入了缓存键的,直接修改 callback 不行,不能将其缓存投毒给其他用户,利用我们刚找到的 utm_content 参数骗过缓存,我们需要需要将 callback 拼接到 utm_content 里面,这样就能让他被缓存,同时我们需要让这段代码又能被后端解析成功执行代码,使用;分隔符,缓存系统认为;及以后的是 utm_contentde 内容,仅将其当作字符串,但是后端处理时可能将;当作分隔符,利用这种缓存系统与后端服务器处理之间的不一致性来达成攻击

7.利用胖 get 请求

阅读完材料大概就是后端接受带有请求体的 get 请求,但是没有将请求体纳入缓存键

和上题相似

如果后端不接受 get 请求的请求体,可以利用 X-HTTP-Method-Override 请求头,该请求头可以更改请求方法,让后端将这个当作别的请求方法如 post 方法去执行,如果它允许这个头并可控的话

8.url 规范化

浏览器会将输入进行 url 编码,但是缓存会将 url 规范化,将浏览器 url 编码的内容等效看作和未编码的内容,这样攻击者手动发送一个 未编码的 xss payload,缓存系统先将其缓存,再将 payload 进行 url 编码让其看上去合法,诱导用户去点击,这时缓存会认为浏览器发送的 url 编码的内容和攻击者发送的未编码内容是等效的,还要依赖于后端会存储你的响应内容

9.缓存键注入

查看前情提要,服务器将多个参数纳入缓存键时使用 __ 分割参数,例如将 query 和 Origin 纳入缓存键会表示 query__Origin__

WEB缓存投毒练习
https://lab404.cn/posts/web-cache-poisoning-exercise/
作者
见山
发布于
2025-11-16
许可协议
CC BY-NC-SA 4.0