本帖最后由 tllm 于 2019-1-28 11:54 编辑
 

从麦当劳的用户中窃取密码

通过AngularJS沙盒执行反射型xss导致麦当劳用户的密码泄露

通过滥用不安全的加密存储和反射形跨站脚本攻击可以获取到麦当劳用户的明文密码。当然了,其他个人信息,如用户名,地址和联系方式也会被窃取

0x01

反射xss利用AngularJS沙盒进行绕过转义

McDonalds.com 有一个搜索的页面,这个页面显示了搜索参数q的值。因此,当我们进行一个搜索测试***********-test-reflected-test-*********** 响应如下显示:

麦当劳使用了AngularJS,因此我们可以尝试去打印唯一的作用域ID,我们可以通过将q参数值更改为{{$id}}来完成这个操作。我们可以看见{{$id}}获得并更改为这个AngulraJS唯一的范围ID(单调递增)

尝试使用{{alert(1)}}作为值 但是并没有起作用,因为所有的AngularJS代码都是在沙箱里面执行的,然而,AngularJS沙盒并不是很安全,事实上它根本不应该信任。它甚至在1.6版本中被删除,它提供了一个错误的保护。PortSwigger写了一篇关于AngularJS沙盒逃逸的好文章

我们首先需要知道McDonalds.com的AngularJS版本。我们可以在控制台上面执行angular.version

这个版本是1.5.3,所以沙盒逃脱的payload就是

{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}

我们使用这个payload作为搜索参数的值,就可以发现成功弹窗

0x02

窃取用户的密码

另外一件事情就是 我注意到在McDonalds.com上有一个非常特殊的复选框。一般来说 你可以在登陆的时候选择“记住我”(Remember me)。但是!麦当劳的登陆页面却给了我们一个选项->记住密码。

我通过搜索所有JavaScript代码的关键词password发现了一些很有意思的解密代码

如果有一件事情是不能做的,那么就是在客户端里面解密代码或者使用对称加密。我尝试在我自己的客户端里面运行代码并且成功执行

penc的值是以cookie的形式存储一年,23333!

麦当劳使用了CryptoJS 去加密和解密敏感数据。他们为每一个用户都使用了相同的key和iv。所以我只需要偷取别人的penc cookie 就可以去解密得到他的明文密码.

我识图在搜索页面上使用一个恶意的payload来解密我的密码,但是没有起作用,因为AngularJS沙盒逃逸的payload 将charAt替换为join,因此getCookie函数失效。getcookie函数尝试在cookie值里面通过检测charAt(0)是否为空格 来达到删除空格的目的。在下面的图片中,你可以看见如果在搜索页面上面执行charAT(0) 将会返回了由0拼接的一个字符串。

我写了一些JS,在首页上嵌套一个iframe,并利用iframe窃取cookie。由于沙盒逃逸导致了payload被多次执行,所以我通过变量xssi**ecuted限制执行条件,这样子paload只会执行一次


if (!window.xssI**ecuted) {

    window.xssI**ecuted = true;

    var iframe = $('<iframe src="https://www.mcdonalds.com/us/en-us.html"></iframe>');

    $('body').append(iframe);

    iframe.on('load', function() {

        var penc = iframe[0].contentWindow.getCookie('penc');

        alert(iframe[0].contentWindow.decrypt(penc));

    });

}

我们现在使用这个exp就可以导致我的密码出现在弹窗中!