MXSS学习【未完成】
前几天,读完了securitum的那篇mxss绕过Dompurity的文章。并写了一篇半抄的随笔。对于MXSS,还处于不求甚解的状态,遂决定花几天时间好好学习一下。
0x00 回顾当前对于常见XSS的防护
我们知道,常见的XSS有3大类:反射型、存储型和DOM型。
对于反射型xss,一般出现在url参数中,最容易处理,可以对url参数进行输入过滤来处理。
对于存储型xss,常出现在富文本内容展示的地方,由于输出点的不固定,它的发现比反射型的要难。修复方式同样可以通过白名单过滤的方式
对于DOMxss,成因比较多样,但基本上是DOM在处理数据过程汇总发生的脚本输入,所以前端进行DOM操作中的对来源数据需要进行校验。
提到xss修复,很多人都只是想到过滤和编码。很多情况下过滤和编码能够解决问题,而很多情况下,我们好考虑的更多一些。
XSS修复的方式不仅仅是过滤和编码,传输路径上我们还可以使用waf进行防护,客户端层面,我们可以设置现代的浏览器支持的Http响应头,X-XSS-Protection, Content-Security-Policy让浏览器内置的安全策略帮助我们提高防护能力。
0x01 本篇主角:MXSS
MXSS,(mutation XSS),我们可以简单的理解成html解析器在解析一段html代码过程中,真实htlm的dom结构和预期dom结构存在差异导致创建了意外标签执行xss的情况。
假设存在一个富文本场景,开发同学使用了黑名单的方式进行xss过滤。那么我们就有机会利用mxss绕过所谓的过滤方式。
0x02 常见的过滤器
让开发同事从头开始写一个xss过滤器往往不太合算。IT发展了这么多年,现在已经存在很多流行的框架或函数库可以让我们轻易的对xss进行过滤,比如:
OWASP JAVA Encode
JSOUP
DOM Purifier
SafeHTML
除去这些成熟的过滤库,有些web框架本身就带有一些xss过滤的功能。但是这些功能安全吗??
我们前端在使用innerText插入字符数据的时候,是不会出现xss的情况的。但是很多web框架和前端开发在处理富文本的时候,他们都用了innerHTML向DOM添加元素(因为innerHTML属性是富文本编辑器存在的基础)。但是innerHTML()并不是一个幂等的功能。innerHTML会调用浏览器的HTML解析器,解析结果可能会进行数据清理和美化,这导致了DOM结构可能不能像预期一样,即使我们对数据进行安全过滤。也可能让无害的代码在innerHTML后造成xss的产生。
这种情况就是mxss漏洞。
0x03 历史上出现的mxss漏洞
最早的mxss,反引号导致属性内容 关闭。这个在Ie8以前的浏览器可以利用。
<img src="foo" alt="``onerror=alert(1)" />
未知元素导致的mxss
<article xmlns="><img src=x onerror=alert(1)"></article> <article xmlns="x:img src=x onerror=alert(1) ">
这是需要在IE9及以前的IE浏览器中触发,成因是由于浏览器不知道HTML5的标记,导致把html5标记当成未知标签,但是通过设置xmlns导致ie浏览器认为这个是xml标签,而在ie中innerhtml对这类属性进行渲染过程中html结构发生变化,导致存在xss攻击的可能性。
CSS转义字符
css中允许用\来进行字符转义,\后面可以是ascii 和unicode,正常转义不会有问题,但是如果碰到了innerHTML. 特殊字符仍然具有转义前的功能。
<p style="font-family:'\22\3bx:expression(alert(1))/*'"> <P style="FONT-FAMILY: ; x: expression(alert(1))"></P>
CSS的变化多端,这里是属性内容中存在转义字符可以在innerHTML。
HTML实体字符
有些特殊标签中的实体字符在通过innerHTML后也会还原:
FIirfox情景
<svg><style><img src=x onerror=alert(1)></svg>
IE情景
<listing><img src=x onerror=alert(1)></listing>
HTML字符实体在所有的CDATA标签也会被解码。svg和mathML空间的标签也不例外。
这样情况导致了HTML过滤库在不同浏览器中有可能因为实体编码还原成原来的字符导致结构被打破导致重新发生了xss问题
0x02 常见触发场景
对于最初开始的mxss 就介绍到这里,其实以前出现的mxss对现今的漏洞挖掘只是有一定的借鉴意义。
mxss常见触发场景有哪些呢?
综上所述,过滤后的数据需要再次进入DOM树进行渲染的时候,才会发现变异。也就是需要存在2次DOM操作。
a.innerHTML = b.innerHTML ; a.innerHTML += 'additional content'; a.insertAdjacentHTML ( 'beforebegin' , b.innerHTML ) ; document.write (b.innerHTML) ;
0x03 DOMpurify 几个绕过
了解完几个的较老的 mxss利用场景和漏洞成因,在回过来看看这个漏洞。忽然觉得mxss很有意思😁。Dompurify应该在国外使用比较多。也有很多大佬挖过它的mxss。
1)
0x04 Mozilla Bleach mxss
0x05 Fuzzer
0x06 防御总结

浙公网安备 33010602011771号