前言
- 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图
京东首页
- 上述功能是由 Android的WebView 实现的,但是 WebView 使用过程中存在许多漏洞,容易造成用户数据泄露等等危险,而很多人往往会忽视这个问题
- 今天我将全面介绍 Android WebView的使用漏洞 及其修复方式
阅读本文前请先阅读:
Android开发:最全面、最易懂的Webview详解
最全面 & 最详细的 Android WebView与JS的交互方式 汇总
目录
目录
1. 类型
WebView中,主要漏洞有三类:
- 任意代码执行漏洞
- 密码明文存储漏洞
- 域控制不严格漏洞
2. 具体分析
2.1 WebView 任意代码执行漏洞
出现该漏洞的原因有三个:
- WebView 中
addJavascriptInterface()
接口 - WebView 内置导出的
searchBoxJavaBridge_
对象 - WebView 内置导出的
accessibility
和accessibilityTraversal
Object 对象
2.1.1 addJavascriptInterface 接口引起远程代码执行漏洞
A. 漏洞产生原因
JS调用Android的其中一个方式是通过addJavascriptInterface
接口进行对象映射:
webView.addJavascriptInterface(new JSObject(), "myObj");
// 参数1:Android的本地对象
// 参数2:JS的对象
// 通过对象映射将Android中的本地对象和JS中的对象进行关联,从而实现JS调用Android的对象和方法
所以,漏洞产生原因是:当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类),从而进行任意代码执行。
如可以执行命令获取本地设备的SD卡中的文件等信息从而造成信息泄露
具体获取系统类的描述:(结合 Java 反射机制)
- Android中的对象有一公共的方法:getClass() ;
- 该方法可以获取到当前类 类型Class
- 该类有一关键的方法: Class.forName;
- 该方法可以加载一个类(可加载 java.lang.Runtime 类)
- 而该类是可以执行本地命令的
以下是攻击的Js核心代码:
function execute(cmdArgs)
{
// 步骤1:遍历 window 对象
// 目的是为了找到包含 getClass ()的对象
// 因为Android映射的JS对象也在window中,所以肯定会遍历到
for (var obj in window) {
if ("getClass" in window[obj]) {
// 步骤2:利用反射调用forName()得到Runtime类对象
alert(obj);
return window[obj].getClass().forName("java.lang.Runtime")