十分强大的混淆
在以前,我们只需要用mxss来把svg命名空间的<style><a id="</style><img src=x onerror=alert()>"></a></style>
弹入html命名空间,就能让<a id="
被解析成文本,而去闭合前者,放出后面的恶意标签。这很让xss过滤器迷惑了,于是常被用来绕过。
当然像DOMPurify这样的过滤器本身会解析一次,所以要嵌套一层突变才能完成这个混淆
比如嵌套一层浏览器的嵌套结点扁平化突变(Node flattening)(好人机的翻译)
1 | <div*506> |
第一次解析
第二次解析
第一次解析的结果让DOMPurify<=3.1.0很蒙圈了,无法完成过滤,3.1.1/2尝试了对嵌套结点的过滤,但是又被DOM clobbering绕过了,再后来DOMPurify干脆用正则匹配来过滤这个<style>
命名空间混淆。细看:https://xz.aliyun.com/news/18231
浏览器的限制
再后来,浏览器也开始限制这种混淆,比如chrome:
style标签从svg到html中时,DomParser直接对双引号中的字符全部做了转义
firefox是直接限制了<style>
的命名空间改变
而edge目前还没有做修复