mutation XSS

之前只在 Google 搜索框的那个 XSS 里见到过...直到昨天.....

这里不谈具体的 case 只想说一下我的理解

首先浏览器的 parser 在不同标签的上下文中行为并不一致

例如(这一段参考了先知社区的...)
​svg(XML)上下文中 style标签中的内容被视为子元素

​<svg><style><a id="</style><evil>"></a></style> 这里style才闭合</svg> 


​普通html上下文中 style标签中的内容被视为纯文本

<style><a id="</style>这里就闭合了 <evil>成功从a的属性里逃逸出来 "></a></style>


​除了 style 之外类似的还有 script noscript 等等, 详见 whatwg 文档

​以上并不是漏洞所在...从类似形式语言的视角来看只是同一段语言在不同上下文(语法)中拥有不同的语义

​真正的漏洞成因在于 sanitizer 解析时的所用语法与浏览器最终生成 DOM 时使用的语法不一致(所以 sanitizer 无法正确处理语义在不同的上下文中的突变)。后果就是 sanitizer 看到的东西和最终输出到 DOM 里的东西在语法结构上不一致(突变),结合前面的 case 在最终的语义上就不同了...

在某些限制没那么严格的 case 里,并不需要用到上述语法二义性的 vector,仅仅利用浏览器的自动补全改变用户输入的上下文就可以绕过 sanitizer 了,我不知道这种的算不算 mxss,也许...?因为语义也突变了,只不过这里突变的是语言(被解析的字符串)本身而不是语法

感兴趣可以看一下我在公司技术分享做的这个ppt

除了这种基于标准的 mXSS,某些浏览器实现的 quirk 也可能导致 mxss (比如老版本 ms-edge 的 parser 处理 title 标签的时候, 类似的例子还有很多, 其中不少都是用 fuzzer 发现的),漏洞成因本质上也是语义二义性