背景介绍:
本文为国外白帽子通过利用XSS以及WAF绕过,配合SSTI从而实现任意用户会话劫持。废话不多说,进入正题!
发现过程:
挖掘过程像往常一样,开启Burp Suite并浏览所有网站链接,没一会儿就发现了一处URL:
https://example.com?redirect=${redirectURL}
这个重定向显然是某种未正确执行的模版语言表达式,注意到这一点,迅速切换到用户配置页面,并开始尝试更改用户名。
首先是数学表达式${2*2}来确定是否存在模版注入漏洞,成功在响应包中收到“4”,看来确实存在模版注入漏洞。那么这个漏洞能用来做什么呢?
经过一段时间的尝试和分析后,发现使用 ${header.cookie} 可以获得当前用户的所有Cookie列表。
那么现在有了带有Cookie信息和SSTI漏洞后,怎样能够实现劫持其它用户呢?答案只能是“XSS”了。
我们需要拥有一个XSS漏洞,利用XSS漏洞可以将受害者的名称更改为 ${header.cookie},然后将 Cookie 转发到攻击者的服务器上就可以了。
说起来简单,做起来可一点不轻松。经过漫长的寻找和挖掘,终于在一处参数为 videoId=w6exeqbemte 的URL上看到了“希望”。
首先尝试在URL末尾添加Payloads:
https://example.com/videos/?videoId=w6exeqbemteqwe‘"<X</
视频没有加载,检查源码发现videoId参数直接注入到了src属性中的
<iframe src="w6exeqbemteqwe’" <X</">
这是个好兆头!那么接下来再换个Payload看看:
?videoId=qwe">
很遗憾,直接被WAF给拦截了。经过一系列的尝试,基本所有通用的Payloads都被一一拦截!
接下来的几天,试着将Payloads放在iframe中,并且尽可能不覆盖src属性, onload onmouseover 同样被WAF拦截。但是 srcdoc 并没有被WAF拦截。
那么接下来就是围绕 srcdoc 的利用了!继续尝试:
?videoId=qwe"srcdoc="\u003ce<script%26Tab;e>"
成功绕过WAF。
Payload的第一部分\u003ce通过伪造打开一个不存在的标记<e来欺骗 WAF,WAF 会先对所有内容进行解码,然后再执行检查,在上面的例子中,WAF 会将 Unicode 文本转换为<e 进行检查,但实际上,它仍然是"\u003ce"文本,因此不会干扰影响后面的脚本执行。
Payload的第二部分 %26Tab;e(	) 来欺骗 WAF 我们没有使用脚本,而是使用其它内容。
有时,可以用空格和另一个属性(如