0046.从图片上传到账户接管——真实渗透测试中上传、存储和 CORS 漏洞的串联
原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NDQ5NTU0MA==&mid=2647690866&idx=1&sn=4a721e43a083294d91530414cbf72330
0046.从图片上传到账户接管——真实渗透测试中上传、存储和 CORS 漏洞的串联
Shazilrao Rsec 2025-07-11 14:27
本文章仅用网络安全研究学习,请勿使用相关技术进行违法犯罪活动。
声明:本文搬运自互联网,如你是原作者,请联系我们!
标签:文件上传、XSS
侦察:查看上传功能
在评测该应用程序时,我注意到它有一个个人资料图片上传功能。我测试了它是否接受其他文件类型,例如 .svg 或 .html——令我惊讶的是,SVG 格式的上传文件被接受并按原样渲染。
上传包含脚本标签的 .svg 图像——初始 XSS 测试
我在浏览器中打开了上传的文件,然后——是的!!——出现了一个弹出窗口!
XSS 弹出窗口确认存储型 XSS 漏洞
这就是事情变得有趣的地方。
会议在哪里?
每当我们发现 XSS 时,接下来的想法应该是:
“我可以窃取会话并证明账户被接管吗?”
于是我立即打开 DevTools 进行检查
document.cookie
——但是没有会话 Cookie,因为应用程序使用的是基于 JWT 的标头身份验证。从防御角度来看,这还不错,但对于攻击者来说,是时候深入挖掘了。
下一站:
localStorage
。
localStorage
但是……惊喜!直接查看上传的XSS文件时,没有找到任何token 。
查看 XSS 页面时 localStorage 中缺少 JWT
第一个问题:访问后才设置令牌/profile
在探索过程中,我注意到登录并导航到
/profile
端点后,前端 JavaScript 会动态获取用户数据 — — 然后才将 JWT 存储在 中
localStorage。
JWT 仅在访问 /profile 后才会出现在 localStorage 中
所以,问题就在这里:
XSS 页面没有 JWT,我们必须强制浏览器先访问,然后等待 JWT 保存完成后,再进行提取。
/profile
制作有效载荷
为了自动化这个链条,我创建了一个 HTML 有效载荷:
1.
/profile
在后台静默加载
1. 等待短暂的延迟
1.
/localStorage
从localStorage中提取 JWT
1. 将其发送到我的 Burp Collaborator 服务器
注入代码以访问
/profile
并窃取令牌
第二次危机:CORS 再次来袭
浏览器尝试通过 发送令牌时抛出了 CORS 错误
fetch()
。
向外部服务器发送令牌时出现 CORS 错误
<img>
不用担心——我用标签而不是 重写了数据泄露逻辑
fetch()
。这样可以绕过 CORS,因为浏览器不会阻止图片加载——即使是跨域的。
修改有效载荷用于
<img>
无 CORS 渗透
当我再次测试它时…控制台中没有出现任何错误。
清理控制台 — 没有 CORS 错误
游戏结束:令牌被盗,会话被劫持
我的 Collaborator 服务器成功接收了 JWT。
JWT 令牌已成功在我的服务器上捕获
为了确认账户接管,我在浏览器控制台中使用了以下命令:
localStorage.setItem('token', '粘贴被盗令牌至此处');
在 localStorage 中设置令牌
然后我刷新了页面……我以受害者的身份登录了。
成功劫持受害者会话
最后的想法
这个漏洞不仅仅与 XSS 有关 — — 它还与多层链接有关:
1. 文件上传配置错误——让 SVG/XSS 通过
1. Token 存储在
localStorage
Cookie 中
1. JWT 仅在访问后设置
/profile
- 泄露期间的 CORS 限制
- 使用创造性技巧(如
<img>
标签)绕过 CORS
如果你发现了 XSS,不要止步于此
alert(1)
— —深入研究:
- 如果没有 cookie,请检查
localStorage
和
sessionStorage
。
– 如果您无法直接访问令牌,请检查哪个页面触发了它。
– 使用浏览器逻辑来对抗自身——强制导航、等待、提取、发送。
– 当 CORS 阻止您的获取时 — — 使用
<img>
、,
<script>
甚至
<form>
!