利用突变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过滤器工作原理

  1. 解析输入(如使用DOMParser.prototype.parseFromString)
  2. 维护安全元素和属性白名单
  3. 遍历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>

浏览器解析行为:

  1. 初始解析: <svg>包含</p>
  2. 变异后: <svg><p></svg>
  3. 再次赋值给innerHTML: <svg></svg><p></p>

完整利用示例

<svg></p><style><a id="</style>">

变异过程:

  1. 初始解析:

    • <svg>包含</p>
    • <style>包含<a>元素
    • id属性包含</style>
  2. 变异后:

    • <svg>提前关闭
    • <style>被正常解析
    • </style>后的``标签被解析并执行

绕过DOMPurify的技术细节

解析差异

  1. 初始解析:

    • 浏览器认为</p><style>都是<svg>的子元素
    • <a>元素被视为<style>的子元素
    • 危险的``在id属性值中,被视为安全
  2. 变异后解析:

    • <svg>元素立即结束
    • 后续内容作为普通HTML解析
    • <style>被正常关闭
    • ``标签被写入DOM树并执行

变体

  1. 使用<math>代替<svg>
  2. 使用</br>代替</p>

防御措施

升级DOMPurify

升级到2.0.1或更高版本。

临时解决方案

禁用<svg><math>标签:

DOMPurify.sanitize(input, {
    FORBID_TAGS: ['svg', 'math']
});

总结

  1. 该漏洞利用Chrome和Safari中的mXSS向量
  2. 关键在于<svg></p>的变异行为
  3. 通过DOM解析差异绕过过滤器的安全检查
  4. 变异导致原本安全的HTML结构变为危险结构

影响范围

  • Chrome 77及之前版本
  • Safari浏览器
  • DOMPurify 2.0.0及之前版本

参考资源

  1. 原始研究文章
  2. DOMPurify官方文档
  3. mXSS原始论文
突变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 过滤过程示例 : 过滤后: 突变XSS(mXSS)原理 定义 突变XSS(Mutation XSS)是指当浏览器解析和重新序列化HTML时发生的非预期DOM结构变化导致的XSS漏洞。 innerHTML的变异行为 innerHTML 赋值时浏览器会自动修复不规范的HTML: 关键问题出现在: 浏览器解析行为: 初始解析: <svg> 包含 </p> 变异后: <svg><p></svg> 再次赋值给innerHTML: <svg></svg><p></p> 完整利用示例 变异过程 : 初始解析: <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> 标签: 总结 该漏洞利用Chrome和Safari中的mXSS向量 关键在于 <svg></p> 的变异行为 通过DOM解析差异绕过过滤器的安全检查 变异导致原本安全的HTML结构变为危险结构 影响范围 Chrome 77及之前版本 Safari浏览器 DOMPurify 2.0.0及之前版本 参考资源 原始研究文章 DOMPurify官方文档 mXSS原始论文