通过PDF上传实现存储型XSS漏洞的深度分析

本文详细分析了在实时聊天系统中通过上传恶意PDF文件实现存储型XSS漏洞的技术细节,包括漏洞发现过程、攻击载荷构造、概念验证演示以及修复建议,为Web安全研究人员提供了实用的漏洞挖掘思路。

通过PDF上传实现存储型XSS漏洞的深度分析

大家好,

我是Firda Nurelia(在LinkedIn上可以找到我)。今天我要分享一个关键的存储型跨站脚本(XSS)漏洞,该漏洞利用实时聊天集成中的PDF上传功能。如果你关心Web安全,这个漏洞既令人大开眼界又非常危险。

🔎 漏洞发现

在测试redacted.com上的实时聊天文件上传功能时,我上传了一个特制的PDF文件,其中包含嵌入的JavaScript。聊天将文件存储在第三方CDN(RedactedCDN文件主机)上,当从聊天中打开上传的PDF时,它会从CDN加载。浏览器在新标签页中执行了PDF中的嵌入JavaScript——这证实了通过PDF上传实现的存储型(持久性)XSS。

💡 攻击载荷(我使用的)

PDF包含一个嵌入的JavaScript /OpenAction载荷,例如:

1
/OpenAction << /S /JavaScript /JS (app.alert(document.domain)) >>

当在浏览器PDF查看器中打开PDF时,此载荷会触发JavaScript警报。在我的概念验证中,警报框通过显示域名证明了代码执行。

🧪 概念验证(PoC)

  1. 访问:https://redacted.com/ 并打开实时聊天小部件(右下角)
  2. 上传包含/OpenAction JavaScript载荷的恶意PDF
  3. 文件存储在第三方文件主机(RedactedCDN)上并出现在聊天中
  4. 点击聊天中的文件链接,在新标签页中打开托管的文件URL
  5. 浏览器执行嵌入的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漏洞,或者只是想打个招呼👋,请在评论区告诉我。

你最近发现了什么漏洞?在下面分享你的经验!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计