通过PDF上传实现存储型XSS漏洞的深度分析
大家好,
我是Firda Nurelia(在LinkedIn上可以找到我)。今天我要分享一个关键的存储型跨站脚本(XSS)漏洞,该漏洞利用实时聊天集成中的PDF上传功能。如果你关心Web安全,这个漏洞既令人大开眼界又非常危险。
🔎 漏洞发现
在测试redacted.com上的实时聊天文件上传功能时,我上传了一个特制的PDF文件,其中包含嵌入的JavaScript。聊天将文件存储在第三方CDN(RedactedCDN文件主机)上,当从聊天中打开上传的PDF时,它会从CDN加载。浏览器在新标签页中执行了PDF中的嵌入JavaScript——这证实了通过PDF上传实现的存储型(持久性)XSS。
💡 攻击载荷(我使用的)
PDF包含一个嵌入的JavaScript /OpenAction载荷,例如:
|
|
当在浏览器PDF查看器中打开PDF时,此载荷会触发JavaScript警报。在我的概念验证中,警报框通过显示域名证明了代码执行。
🧪 概念验证(PoC)
- 访问:https://redacted.com/ 并打开实时聊天小部件(右下角)
- 上传包含/OpenAction JavaScript载荷的恶意PDF
- 文件存储在第三方文件主机(RedactedCDN)上并出现在聊天中
- 点击聊天中的文件链接,在新标签页中打开托管的文件URL
- 浏览器执行嵌入的JS并出现弹出窗口(XSS证明)
https://files.redacted.app/attachments/49830/78c30b02-4e47-4e58-b73d-108833f67589/success_xss.pdf
当从聊天中点击该文件时,文件在CDN域上打开并在新标签页中触发alert()弹出窗口——确认了存储型XSS。
⚠️ 影响(简短而关键)
- 在打开文件的任何用户或管理员浏览器中执行任意JavaScript
- 持久性(存储型)XSS:载荷在页面刷新后仍然存在,并保留在聊天历史记录中
- 可能导致会话劫持、凭据盗窃、网络钓鱼、账户接管或篡改——如果特权支持代理打开文件尤其危险
🔐 修复建议
- 从PDF中剥离JavaScript——在上传过程中删除/OpenAction等活动对象
- 强制文件下载——使用Content-Disposition: attachment提供上传文件,并应用安全头(CSP、X-Content-Type-Options: nosniff)
- 验证和扫描文件——在提供文件之前检查文件类型并扫描恶意内容
📎 参考资料和说明
- CWE-79:网页生成期间输入中和不当 - https://cwe.mitre.org/data/definitions/79.html
- CVSS v3.1(使用的示例基础分数):7.4(高)
- 报告提交时间:2025年7月31日
- 收到回复(信息性):2025年8月31日
🎯 结论
这个漏洞展示了小的配置错误(如未净化的输入)如何导致严重风险。即使是受信任的平台也可能在容易被忽视的功能中隐藏关键缺陷。
感谢阅读!如果你发现过类似的XSS漏洞,或者只是想打个招呼👋,请在评论区告诉我。
你最近发现了什么漏洞?在下面分享你的经验!