xss最常用的命名空间混淆被浏览器暗改了~

十分强大的混淆

在以前,我们只需要用mxss来把svg命名空间的<style><a id="</style><img src=x onerror=alert()>"></a></style>弹入html命名空间,就能让<a id="被解析成文本,而去闭合前者,放出后面的恶意标签。这很让xss过滤器迷惑了,于是常被用来绕过。

当然像DOMPurify这样的过滤器本身会解析一次,所以要嵌套一层突变才能完成这个混淆

比如嵌套一层浏览器的嵌套结点扁平化突变(Node flattening)(好人机的翻译)

1
2
3
4
5
6
7
8
9
10
11
12
<div*506>
<table>
<caption>
<svg>
<title>
<table></table>
<caption></caption>
</title>
<style><a id="</style><img src=x onerror=alert()>"></a></style>
</svg>
</caption>
</table>

第一次解析

第二次解析

第一次解析的结果让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目前还没有做修复