利用突变XSS绕过DOMPurify 2.0.0
字数 1195 2025-08-26 22:11:14
突变XSS绕过DOMPurify 2.0.0技术分析
前言
本文详细分析了一种利用突变XSS(mXSS)绕过DOMPurify 2.0.0的技术。DOMPurify是一个广泛使用的XSS过滤器,2019年9月19日发布的更新修复了本文讨论的绕过问题。
HTML过滤器基础
为什么需要HTML过滤器
许多Web应用程序(如编辑器)允许用户使用特殊文本格式(粗体、斜体等),这在博客和邮件系统中很常见。主要安全问题在于恶意用户可能输入恶意HTML/JavaScript导致XSS漏洞。
HTML过滤器工作原理
- 解析输入(如使用
DOMParser.prototype.parseFromString) - 维护安全元素和属性白名单
- 遍历DOM树并删除不在白名单中的内容
示例白名单:
- 允许元素:
<div>,<b>,<i>, `` - 允许属性:
src
过滤过程示例:
<div>I am trying to be <i>malicious</i> <u>here</u>! <img src=1 onerror=alert(1)></div>
过滤后:
<div>I am trying to be <i>malicious</i> here! <img src="1"></div>
突变XSS(mXSS)原理
定义
突变XSS(Mutation XSS)是指当浏览器解析和重新序列化HTML时发生的非预期DOM结构变化导致的XSS漏洞。
innerHTML的变异行为
innerHTML赋值时浏览器会自动修复不规范的HTML:
element.innerHTML = '<u>Some <i>HTML'
// 读取时可能得到: "<u>Some <i>HTML</i></u>"
关键问题出现在:
element.innerHTML = element.innerHTML
// 看似无害的操作可能导致DOM结构突变
## Chrome中的mXSS漏洞
### 基本向量
```html
<svg></p>
浏览器解析行为:
- 初始解析:
<svg>包含</p> - 变异后:
<svg><p></svg> - 再次赋值给innerHTML:
<svg></svg><p></p>
完整利用示例
<svg></p><style><a id="</style>">
变异过程:
-
初始解析:
<svg>包含</p><style>包含<a>元素id属性包含</style>
-
变异后:
<svg>提前关闭<style>被正常解析</style>后的``标签被解析并执行
绕过DOMPurify的技术细节
解析差异
-
初始解析:
- 浏览器认为
</p>和<style>都是<svg>的子元素 <a>元素被视为<style>的子元素- 危险的``在
id属性值中,被视为安全
- 浏览器认为
-
变异后解析:
<svg>元素立即结束- 后续内容作为普通HTML解析
<style>被正常关闭- ``标签被写入DOM树并执行
变体
- 使用
<math>代替<svg> - 使用
</br>代替</p>
防御措施
升级DOMPurify
升级到2.0.1或更高版本。
临时解决方案
禁用<svg>和<math>标签:
DOMPurify.sanitize(input, {
FORBID_TAGS: ['svg', 'math']
});
总结
- 该漏洞利用Chrome和Safari中的mXSS向量
- 关键在于
<svg></p>的变异行为 - 通过DOM解析差异绕过过滤器的安全检查
- 变异导致原本安全的HTML结构变为危险结构
影响范围
- Chrome 77及之前版本
- Safari浏览器
- DOMPurify 2.0.0及之前版本