之前只在 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 发现的),漏洞成因本质上也是语义二义性