八个 SVG 净化库六个被绕过:响应头里也能藏 XSS
来源:portswigger.net — 2026-10-27
📋 概述
Gareth Heyes 测了八个流行 SVG 净化库,绕过其中六个。手法包括:把单个元素的命名空间切成 XHTML,就能在 SVG 里直接渲染 HTML 与 iframe;净化器把元素名转成驼峰后查询小写名,结果 foreignObject 直穿;放行 animate 标签就能把链接的 href 动画成 javascript:;用指向 data URL 的 xml-stylesheet 处理指令加载自带 XSLT 执行脚本;更狠的是把这份样式表塞进 Link 响应头,正文是完全无害的 XML,Firefox 照样执行。Safari 还能用 use 把含载荷的 GIF 当 SVG 引入。DOMPurify 与 darylldoyle/svg-sanitizer 全部挡住。
🔑 核心要点
命名空间混淆是最便宜的绕过:把单个元素的命名空间改成 XHTML ,浏览器就把它当 HTML 渲染在 SVG 内
大小写陷阱:净化器查 querySelectorAll('foreignobject') 而真实元素名是 foreignObject ,载荷直穿
动画也能造链接:animate 未被拦截,可把 a 的 href 动画成 javascript: ;animateTransform 在 Safari 同样可用
自带 XSLT 是一条完整利用链:xml-stylesheet 指向 data URL 里的样式表 ,输出的脚本在本域执行而非 null 域
最有意思的一条:把 XSLT 放进 Link 响应头,正文是彻底无害的 XML,Firefox 仍会执行 ;该特性 2026 年 11 月将被移除
Safari 的怪癖:use 元素可以把上传的 GIF 当 SVG 导入并触发 onerror ,一条标签绕过三个库
两个赢家:DOMPurify 与 darylldoyle/svg-sanitizer 挡住了本文所有手法
💡 金句
I tested eight popular SVG sanitizers and bypassed six of them. In this post, I'll show you how a response header can run JavaScript in Firefox even when the response body is completely harmless XML.
👍 0
❤️ 点赞
👎 0
沉底
← 返回 Lobsters 首页