0x01 前言
最近由于公司的需求,需要检测一下webview的跨域漏洞,也就是前几个月很火的支付宝应用克隆事件的漏洞,所以需要了解并复现相关的漏洞,
该漏洞是由腾讯的玄武实验室发现的,支付宝克隆事件的具体发生场景如下:
用户在接收一条短信后,点开其中的链接,自动打开支付宝的webview组件,并加载相关的链接,之后跳到的界面是攻击者进行设置的抽奖界面,但是这个时候,对方的手机已经克隆了用户的支付宝,并可以正常使用二维码和小额转账等功能。
其实整个漏洞的关键所在是支付宝口令红包的业务需求,打开了webview的跨域访问功能,这就给了黑客一个有利的攻击点。通过加载相关的链接,获取到包含用户登录状态的信息的文件,把内容都上传到攻击者自己的服务器中,在导入攻击者准备好的手机中,从而使得攻击者的拥有和被攻击者一样的软件,达到一个克隆的效果。
0x01 漏洞攻击流程
根据前面我们分析的场景,我们可以把该漏洞的整个原理整理成下面的流程图。
第一步:我们要通过短信或者其他操作,发送恶意链接到用户的手机中,该链接包含很多东西,包括下载xxx.html语句,还用调用支付宝webview组件和加载xxx.html文件的语句。
第二步:通过点击该恶意链接,然后恶意软件就调用浏览器下载xxx.html文件到指定的下载目录中,一般像chorme浏览器是被文件下载到sdcard/Download/目录下面。
第三步:之前的恶意链接中,其中有调用支付宝的webview组件,通过scheme协议,然后因为其中的跨域功能已经打开,所以使其加载file:///协议的文件,就是我们之前下载好的xxx.html文件。
第四步:在xxx.html文件中,我们已经写好获取到支付宝内部私有目录的文件内容的语句,然后经过长期的研究,查看其中文件中,那些是包含支付宝用户的登陆信息的文件,然后把这些文件的内容全部上传到我们搭建好的服务器中。
第五步:获取到我们需要的文件内容后,我们就把这些文件直接全部导入到我们准备好的手机中,该手机要有支付宝软件,然后把文件直接覆盖到支付宝私有目录中,然后重新打开支付宝软件,其中就直接拥有了用户信息。
0x03漏洞原理
下面我们细讲其中的原理,我们先讲解其中的第二步,点击恶意链接,使得浏览器自动下载xxx.html文件,这个原理的关键是利用到了老版本的chrome浏览器的漏洞,可以让Android系统自带浏览器静默下载html文件到默认的下载目录下,过程不需要与用户交互。即使现在,chrome的最新版仍然可以通过访问一个链接直接静默下载html文件到默认下载目录下,关键的语句是:
就是设置头部信息,表示把print的内容写到filename.html文件中。我们就可以直接利用其写一个AutoDown.jsp,去老版本的chrome浏览器访问,发现在sdcard/Download直接由相应的文件。在新的版本会有相应的提示框,提示是否下载相应的文件。
所以我们只要把我们要写的语句写入到print方法中就可以了。
在第三步中,我们要调用起支付宝的webview组件,然后加载我们的之前通过浏览器下载的html文件,其实这里利用的其实通过网页唤起第三方APP的技术,做过安卓开发的应该都很熟悉。支付宝、导航系统、各种手机播放器等APP都大量的用到了这种技术,比如通过网页打开一个视频播放界面,这时旁边会有个按钮“在APP中播放”,点击后会直接打开对应的APP继续播放之前的视频。实现这个需求只需要在定义activity的时候,指定一个scheme(协议),并且设置一个name为android.intent.category.BROWSABLE的category即可。
其中我们发现符合标准的scheme有很多种,所以这些是需要网上搜索相关资料就可以找到这个几个scheme的使用方法。
我们就找到其中一个方法,写了个demo,直接在支付宝界面打开百度,说明就是这个原理。
实现之后,我们就要加载我们之前浏览器下载的xxx.html文件,然后读取支付宝的私有目录文件。这里利用的原理就是我们说的跨域攻击了,关键在于webview组件设置的两个属性。通过file域访问file域的资源需要设置API setAllowFileAccessFromFileURLs为true,通过file域访问其他域,如http域的资源,需要设置API setAllowUniversalAccessFromFileURLs为true。因为我们要加载file域文件,所以只要其中一个属性为true就行。
但是这里就遇到一个深刻的问题,就是我的html的确打开了支付宝软件,在之前我们是可以加载到我们内部的指定的html文件,也得到了我要的结果,但是现在我显现出来的结果不对,我的根据的shceme协议是下面三个协议:
我根据其中scheme协议进行相应的修改了我的demo。
然后在cloneapp_up.xml中,我要获取到私有目录的welcome.xml文件,然后
显示出来。
我在之前试过得到的结果就是直接显现出我们welcome.xml文件内容(左图),但是现在得到的却是一个更新界面(右图),一样的版本,一样的demo,我认为是没有加载到我们的html文件,也就是未加载file域的文件。
之后的第四步,把我们的获取的文件的内容上传到服务器中,这里就直接在我们的cloneapp_up.xml中进行编写。其中需要获取的文件,我们之前已经说过,是要包含用户向信息的文件,在网上搜寻获取到,我们需要如下的文件:
最后的第五步,就是把获取到的内容直接全部导入我们准备好的手机的支付宝私有目录下面,进行覆盖。这里可以利用一些工具例如re文件管理器,轻松替换,然后重新打开支付宝,就会发现有相同的用户信息,达到克隆目的。

0x04 总结
整个漏洞攻击的流程,其实是相对简单的,但是漏洞实现的条件也是相对比较苛刻的,需要满足几个条件:
1.攻击者可以外部调用被攻击APP,指令其加载一个本地的html文件。从前文得知通过向支付宝现在通过外部加载file协议失败,说明都有进行相应的措施。
2.被攻击APP的setAllowUniversalAccessFromFileURLs值为true。这个条件就比较苛刻了,在Android4.1(2012年发布)之前的版本,该选项默认为True,之后的版本默认值为False。所以除非APP是很老的版本,或者是新版本有着很特殊的业务需求,否则的话是不会将setAllowUniversalAccessFromFileURLs设置为True的。
3.攻击者需要在被攻击的手机上下载一个html文件并保存在一个可被File协议访问到的位置。在Android老版本曾经出现过几个漏洞,可以让Android系统自带浏览器静默下载html文件到默认的下载目录下,过程不需要与用户交互。但是现在大多数的过长手机默认浏览器不在是chrome浏览器,都是会有相应的下载提示的。
最后说下防御措施:
1、APP不要支持Android4.1(API level 16)之前的版本,提倡用户尽量使用新的安卓版本。
2、如果业务不需要的话,针对于webview属性的setAllowFileAccessFromFileURLs
或setAllowUniversalAccessFromFileURLs显示设置为False。
3、不要点击莫名短信的链接和网站上面的钓鱼网站。
转自:https://blog.csdn.net/JiaoMaGe/article/details/103009378