diff --git a/data.json b/data.json index c113d16e..7aa06602 100644 --- a/data.json +++ b/data.json @@ -1158,5 +1158,6 @@ "https://mp.weixin.qq.com/s?__biz=MzUyOTc3NTQ5MA==&mid=2247497324&idx=3&sn=726aa5ada489a6cc591b1f36e419bb9b&chksm=fa595881cd2ed197da53a8f8a689200cddc5e420f03195716fffc04190c050059eafd0e665bc&scene=58&subscene=0": "漏洞分析 | 挖掘 .NET SqlSugar 框架SQL注入", "https://mp.weixin.qq.com/s?__biz=MjM5OTk2MTMxOQ==&mid=2727840329&idx=1&sn=8e4b7109f4601396270ae0922058dd61&chksm=80505dc1b727d4d7f11a0db75283d0a13c1e9887756a1a2d702a3646b7be19b286333c0c9298&scene=58&subscene=0": "【活动】2024漏洞马拉松活动来袭,史无前例反爬专项单个奖励最高5w!", "https://mp.weixin.qq.com/s?__biz=MjM5NjA0NjgyMA==&mid=2651309096&idx=1&sn=4e32dd93c350ea357aa0013d017d03d8": "关键的联发科芯片组漏洞影响15亿手机用户", - "https://mp.weixin.qq.com/s?__biz=Mzg3NTU3NTY0Nw==&mid=2247489413&idx=1&sn=fcde34dfbd9e6aa9333ff082c3d3c056": "第一届数证杯团体赛---服务器取证" + "https://mp.weixin.qq.com/s?__biz=Mzg3NTU3NTY0Nw==&mid=2247489413&idx=1&sn=fcde34dfbd9e6aa9333ff082c3d3c056": "第一届数证杯团体赛---服务器取证", + "https://mp.weixin.qq.com/s?__biz=MzU0NDI5NTY4OQ==&mid=2247486237&idx=1&sn=61373f8016157b66e2c28307cdd3de53": "一文看懂安卓JSB风险漏洞挖掘" } \ No newline at end of file diff --git a/doc/一文看懂安卓JSB风险漏洞挖掘.md b/doc/一文看懂安卓JSB风险漏洞挖掘.md new file mode 100644 index 00000000..a519c32f --- /dev/null +++ b/doc/一文看懂安卓JSB风险漏洞挖掘.md @@ -0,0 +1,508 @@ +# 一文看懂安卓JSB风险漏洞挖掘 +原创 比心皮卡丘 暴暴的皮卡丘 2024-12-08 05:16 + +JSB基础 + +JavaScript Bridge(简称 JSB)是一种在移动端开发中广泛使用的技术,用于实现 JavaScript 与本地代码(如 Java 或 Kotlin)之间的通信。虽然 JSB 为混合开发提供了强大的能力,但其不当使用可能导致严重的安全问题。 + + + +本文将围绕以下内容展开: +1. **JSB 的基本原理** +1. **安卓中的 JSB 使用案例及代码** +1. **JSB 的安全风险及原理分析** +1. **漏洞挖掘示例与利用 Payload** +## 一、JSB 的基本原理 + +JSB 是在 WebView 环境中实现前端与本地代码交互的桥梁。其工作原理通常分为以下两种: +### 1.1 addJavascriptInterface 方法 + +安卓通过 WebView 的addJavascriptInterface + 方法将 Java 对象绑定到 JavaScript 上下文中,从而允许前端页面调用指定 Java 方法。 +``` +webView.addJavascriptInterface(new MyJavaScriptInterface(), "Android"); + +``` + +在前端,JavaScript 可以通过window.Android.methodName() + 调用方法。 +### 1.2 URL 拦截模式 + +前端通过特定的 URL Scheme 发起请求,WebView 的shouldOverrideUrlLoading + 拦截这些请求后,根据路径或参数分发到对应的本地代码逻辑。 +``` +window.location.href = "jsbridge://methodName?param1=value1"; + +``` + +本地代码解析 URL 并执行对应逻辑。 + +## 二、安卓中的 JSB 使用案例及代码 + +以下展示一个简单的 JSB 示例: +### 2.1 使用addJavascriptInterface +#### Java 代码 +``` +public class MyJavaScriptInterface { + @JavascriptInterface + public void showToast(String message) { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } +} +webView.addJavascriptInterface(new MyJavaScriptInterface(), "Android"); + +``` +#### JavaScript 代码 +``` +function callAndroidToast() { + window.Android.showToast("Hello from JavaScript!"); +} + +``` +#### +#### +### 2.2 使用 URL 拦截 +#### Java 代码 +``` +webView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (url.startsWith("jsbridge://")) { + String methodName = url.split("//")[1].split("\\?")[0]; + if ("showToast".equals(methodName)) { + Toast.makeText(context, "Triggered by URL", Toast.LENGTH_SHORT).show(); + } + return true; + } + return super.shouldOverrideUrlLoading(view, url); + } +}); + +``` +#### +#### JavaScript 代码 +``` +function triggerAndroidViaUrl() { + window.location.href = "jsbridge://showToast"; +} + +``` +#### +#### +#### +## 三、JSB 的安全风险及原理分析 +## +### 3.1 安全风险 +1. **未授权方法调用** + - 风险描述:如果addJavascriptInterface + 绑定的对象中包含敏感操作,攻击者可通过 JavaScript 恶意调用。 + + - 原理:@JavascriptInterface + 暴露的所有方法对前端页面无差别开放。 + + +1. 风险描述:如果addJavascriptInterface + 绑定的对象中包含敏感操作,攻击者可通过 JavaScript 恶意调用。 + +1. 原理:@JavascriptInterface + 暴露的所有方法对前端页面无差别开放。 + +1. **跨域恶意注入** + - 风险描述:WebView 未限制加载域名,攻击者可通过恶意页面执行任意代码。 + + - 原理:恶意页面利用暴露的 JSB 接口调用敏感方法。 + + +1. 风险描述:WebView 未限制加载域名,攻击者可通过恶意页面执行任意代码。 + +1. 原理:恶意页面利用暴露的 JSB 接口调用敏感方法。 + +1. **数据注入与代码执行** + - 风险描述:通过 URL 拦截模式传递恶意参数,本地代码解析并执行时可能导致任意代码执行。 + + - 原理:缺乏严格的参数校验与处理机制 + + +1. 风险描述:通过 URL 拦截模式传递恶意参数,本地代码解析并执行时可能导致任意代码执行。 + +1. 原理:缺乏严格的参数校验与处理机制 + +### +### 3.2 安全风险的详细示例 +#### 1. 未授权方法调用 + +**风险描述** +addJavascriptInterface + 暴露的所有方法没有鉴权机制,攻击者可以通过恶意页面调用敏感方法,执行未经授权的操作。 + +**漏洞代码示例** +``` +public class UnsafeInterface { + @JavascriptInterface + public void deleteFile(String filePath) { + File file = new File(filePath); + if (file.exists()) { + file.delete(); // 未进行权限校验 + } + } +} +webView.addJavascriptInterface(new UnsafeInterface(), "Android"); + +``` + +**攻击代码** + +攻击者只需要在加载到的 WebView 页面中执行以下 JavaScript,即可删除目标文件: +``` +window.Android.deleteFile("/data/data/com.vulnerable.app/shared_prefs/config.xml"); + +``` + +**风险分析** +- **原理:addJavascriptInterface 暴露的方法对任何加载的页面都开放,无需身份验证,敏感操作可能被恶意利用。** +- **影响:可能导致数据被删除、隐私泄露等问题。** +#### 2. 跨域恶意注入 +#### + +**风险描述** + +如果 WebView 加载了非可信页面或被注入恶意代码,这些页面可以利用 JSB 接口调用本地代码,执行敏感操作。 + +**漏洞代码示例** +``` +webView.loadUrl("https://trusted.domain"); // 加载可信页面 +webView.addJavascriptInterface(new SafeInterface(), "Android"); +public class SafeInterface { + @JavascriptInterface + public String getSensitiveData() { + return "This is sensitive data"; // 暴露敏感数据 + } +} + +``` + +**攻击场景** +1. 恶意代码通过 XSS 注入到https://trusted.domain + 页面。 + +1. 恶意脚本调用暴露的接口: + +``` +var sensitiveData = window.Android.getSensitiveData(); +alert(sensitiveData); // 弹窗显示敏感数据 + +``` + +**风险分析** +- **原理:即使页面本身可信,但如果存在 XSS 漏洞,攻击者可以借助暴露的 JSB 接口执行恶意代码。** +- **影响:导致敏感信息泄露,如用户隐私或应用内部数据。** +#### 3. 数据注入与代码执行 + +**风险描述** + +通过 URL 拦截模式传递的参数,如果解析逻辑不安全,可能导致任意代码执行。 + +**漏洞代码示例** +``` +webView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (url.startsWith("jsbridge://")) { + String command = Uri.parse(url).getQueryParameter("command"); + executeCommand(command); // 存在执行注入的风险 + return true; + } + return super.shouldOverrideUrlLoading(view, url); + } + private void executeCommand(String command) { + try { + Runtime.getRuntime().exec(command); // 未校验直接执行 + } catch (IOException e) { + e.printStackTrace(); + } + } +}); + +``` + +**攻击代码** + +恶意页面可以构造特定 URL,利用上述漏洞执行任意命令: +``` +window.location.href = "jsbridge://execute?command=rm -rf /"; + +``` + +风险分析 +- **原理:缺乏参数校验和严格的 URL 解析逻辑,恶意参数会被直接当作命令执行。** +- **影响:攻击者可利用此漏洞删除文件、安装恶意程序,甚至完全控制设备。** +## 四、漏洞挖掘步骤与常用 Payload +## +#### 4.1 漏洞挖掘步骤 +#### +##### 1. 确定目标环境 +1. ##### 获取目标应用的安装包(APK)。 + +1. ##### 确定是否使用了 WebView 和 JSB 技术(通过观察功能,如页面与系统功能交互行为)。 + +##### 2. 静态分析 +- 使用**JADX** + 或**Apktool** + 对目标 APK 进行反编译,分析addJavascriptInterface + 的调用点: 1. 搜索关键代码:addJavascriptInterface + 和setWebViewClient +。 + + 1. 确定暴露的 Java 对象名称及其暴露的方法。 + + + +- 搜索关键代码:addJavascriptInterface + 和setWebViewClient +。 + +- 确定暴露的 Java 对象名称及其暴露的方法。 + +**** +**示例代码段** + +通过反编译,发现以下代码: +``` +webView.addJavascriptInterface(new UnsafeInterface(), "Android"); + +``` +``` +public class UnsafeInterface { + @JavascriptInterface + public void executeCommand(String command) { + Runtime.getRuntime().exec(command); + } +} + +``` + +**分析重点** +- UnsafeInterface对象暴露了哪些方法? +- 是否存在敏感功能(如文件操作、命令执行) + +## +##### 3. 动态调试 + +使用工具如**Frida** + 或**Xposed** + 对目标应用进行动态调试: +1. Hook 暴露的 JSB 方法,记录前端调用的参数和实际行为。 + +1. 分析 URL 拦截模式,检查本地解析逻辑的安全性。 + +Frida 示例脚本 +``` +Java.perform(function () { + var UnsafeInterface = Java.use("com.vulnerable.app.UnsafeInterface"); + UnsafeInterface.executeCommand.implementation = function (command) { + console.log("Command received: " + command); + // 打印并替换恶意命令 + this.executeCommand("ls /data/"); + }; +}); + +``` +##### 4. 构造恶意页面 + +构造 HTML 文件,模拟前端调用 JSB 接口的行为: +1. 测试所有暴露的接口是否存在安全隐患。 + +1. 传递不同类型的参数(正常值、特殊字符、恶意命令等)。 + +## +## +#### 4.2 测试案例 +#### +##### 测试场景 1:未授权方法调用 + +构造恶意页面,通过暴露接口调用敏感方法: +``` + + +
+