XSS 进阶:MXSS / UXSS / SVG / PDF / SWF 等载体与复现方法
下面整理一些进阶 XSS 载体与攻击面,包括 MXSS、UXSS(浏览器或扩展层面的 XSS)、以及 SVG、PDF、Flash(SWF) 等非传统图片/文件格式作为 XSS 载体的原理与示例。
MXSS & UXSS — 概念与示例
-
MXSS(Mutation XSS) 参考:
https://www.fooying.com/the-art-of-xss-1-introduction/ -
UXSS(Universal Cross-Site Scripting)
UXSS 是利用浏览器或浏览器扩展的漏洞来触发 XSS 的一种方式(例如浏览器翻译插件错误处理导致注入并执行)。这类 XSS 不依赖于被测站点的输入输出缺陷,而是利用浏览器或插件自身的缺陷造成脚本执行。 -
示例 CVE:MICROSOFT EDGE uXSS CVE-2021-34506
Edge 浏览器翻译功能导致 JS 语句被错误调用执行(参考)
视频演示: https://www.bilibili.com/video/BV1fX4y1c7rX
SVG → XSS(SVG-XSS)
SVG(Scalable Vector Graphics)是一种基于 XML 的矢量图格式。与 JPG/PNG 不同,SVG 文件可以使用文本编辑器直接查看/编辑,并且许多 SVG 元素、属性、脚本都能在浏览器中执行,从而成为 XSS 的载体。
示例(危险的 SVG,演示目的):
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
<script>alert(1)</script>
</svg>
注意:如果站点允许上传或直接托管并通过浏览器渲染 SVG,攻击者可利用内嵌 <script> 或某些事件属性(如 onload)来执行 JS,从而实现 XSS。
防护建议:对上传的 SVG 做严格消毒(移除 <script>、事件属性、外部引用等),或将 SVG 当作静态图片以文本方式禁用脚本执行(例如在渲染上下文中使用 <img> 并确保浏览器不会解析内联 SVG 来源),或采用服务器端转换(生成 raster 图像)以彻底避免脚本执行风险。
PDF → XSS(PDF-XSS)
PDF 文件支持内置动作(JavaScript)与交互行为;攻击者可以在 PDF 中嵌入 JavaScript,在某些场景下(例如浏览器内置 PDF 查看器或第三方 PDF 阅读器)这些 JS 可能被触发,造成 XSS 或更高危害。
常见思路:
- 在 PDF 中加入动作/JavaScript。
- 将 PDF 上传并获得可直接访问的直链(或被浏览器预览触发)。
- 访问该直链后,PDF 内的 JS 被触发(具体触发条件取决于阅读器/查看器)。
示例:使用 PyPDF2 给 PDF 添加简单 JS 的示意脚本
from PyPDF2 import PdfReader, PdfWriter
new_PDF = PdfWriter()
# 写入JavaScript代码
new_PDF.add_js("app.alert('xss');")
f = open("E:/path/to/output.pdf","wb")
new_PDF.write(f)
f.close()
注意:不同 PDF 阅读器对内嵌 JavaScript 的支持与限制差异很大,现代浏览器通常在内置 PDF 渲染器中限制或禁用某些 JS 功能,但在某些插件或特定配置下仍可能触发。请以受控环境测试并保存测试授权。
参考文章:借助 PDF 进行 XSS 漏洞攻击(示例)
https://blog.csdn.net/qq_48201589/article/details/135856195
Flash(SWF)→ XSS(Flash-XSS)
Flash(SWF)可以与宿主页面的 JavaScript 交互(例如 ExternalInterface.call),因此不安全的 Flash文件可能成为跨站脚本的媒介(尤其在旧有或已启用 Flash 的环境中)。
制作与触发思路:
- 新建 SWF 文件(使用 Adobe Flash 或其它工具)。
- 在 SWF 中通过
ExternalInterface.call或其它桥接函数调用宿主页面 JS(例如读取 URL 参数并调用宿主的 JS)。 - 构造 URL 参数(例如
?m=alert(/xss/))触发。
示例(ActionScript 伪代码):
// 取 m 参数
var m = _root.m;
// 调用 html 中 Javascript 中的 m 参数值
flash.external.ExternalInterface.call(m);
// 触发:?m=alert(/xss/)
测试步骤:
- 反编译 SWF(例如用 JPEXS Free Flash Decompiler)查看是否有危险函数调用(
ExternalInterface.call,getURL,navigateToURL,htmlText等)。 - 查找可控参数并尝试触发调用,评估宿主环境是否会执行传入的 JS。
注意:Flash 已在大部分现代浏览器中被淘汰/禁用,但在仍使用旧系统或特殊企业环境中仍可能存在风险。若目标环境仍然支持 Flash,请谨慎测试并优先建议升级或移除 Flash 支持。
上传类 XSS(文件上传触发)
文件上传为 XSS 提供了多种路径:
- 直接上传可包含脚本的文件(如 HTML/SVG/SWF/PDF)并通过直链访问或渲染触发。
- 文件名、元数据(如 EXIF)、SVG 内容、富文本附件等作为回显点导致脚本执行。
- 上传后的 MIME 类型、Content-Type、服务端对文件的处理(是否转存、是否设置安全 header)会影响是否触发。
防护建议:
- 对上传的文件类型进行严格白名单控制。
- 对可托管为静态资源的文件,务必正确设置
Content-Type与Content-Disposition(attachment vs inline)以避免浏览器直接解析并执行脚本。 - 对 SVG、HTML、SWF 等文本型文件进行内容消毒或直接拒绝上传。
- 对文件名进行 HTML/Attribute 编码与白名单校验,避免文件名回显引发 XSS。
反编译与检测工具(示例)
- SWF 反编译:JPEXS Free Flash Decompiler(用于查看 SWF 内部代码,查找危险调用)
- PDF 分析:使用 PDF 解析/编辑库(如 PyPDF2、pdfminer)查看是否有内嵌 JS 或动作(/AA、/OpenAction 等)
- SVG / HTML:直接用文本编辑器查看并审计内嵌脚本或事件属性
- 常规渗透工具:Burp Suite、OWASP ZAP、手工浏览器 Console 与断点调试(针对 DOM XSS)
小结
- 非传统媒介(SVG/PDF/SWF 等)能以多种方式触发脚本执行,必须在上传/托管与渲染路径上采取严格防护。
- 许多攻击依赖于宿主环境(浏览器、插件、阅读器等)的行为差异,因此测试需在目标环境下复现并保存证据。
- 在进行此类测试时务必有清晰的书面授权与测试范围,避免对生产环境或无关系统造成影响。
参考与延伸阅读
- MXSS 概述:https://www.fooying.com/the-art-of-xss-1-introduction/
- Edge uXSS CVE-2021-34506(示例视频):https://www.bilibili.com/video/BV1fX4y1c7rX
- PDF / SVG / SWF 相关复现与工具:网络公开教程与工具页面(请在授权环境中测试)