通过漏洞靶场学习Android应用安全
字数 2782 2025-08-22 12:22:54

Android应用安全实战:漏洞靶场学习指南

1. 测试环境搭建

1.1 硬件与软件配置

  • 硬件:ARM版MacBook
  • 模拟器:Android Studio自带虚拟机
  • 系统镜像:Android 14.0 (Default Android System Image)
  • 特点:不带Google Play的镜像可直接获得Root权限,支持Frida

1.2 工具准备

  • 逆向工具:jadx-gui
  • 动态分析工具:Frida、Objection
  • 抓包工具:BurpSuite
  • 其他工具:Apktool、Drozer

2. 常见Android漏洞类型与实战

2.1 不安全日志记录 (Insecure Logging)

漏洞原理

  • 开发中常使用日志输出调试信息,可能泄露敏感数据
  • 通过adb logcat可查看应用日志

靶场示例

adb logcat --pid=$(adb shell pidof infosecadventures.allsafe)

实际案例

  • BitCoin Wallet在日志中输出OAuth响应

安全限制

  • Android 4.1之前可通过READ_LOGS权限读取
  • 新版本已限制该权限,风险降低

2.2 硬编码凭证 (Hardcoded Credentials)

漏洞原理

  • 将敏感信息如账号密码硬编码在应用中

分析方法

  1. 使用jadx-gui逆向APK
  2. 查找Fragment或Activity相关代码
  3. 定位硬编码的凭证

实际案例

  • 多个HackerOne报告中的硬编码密钥、API KEY问题

防护建议

  • 避免在代码中存储敏感信息
  • 使用Android Keystore系统

2.3 Firebase数据库配置错误

Firebase Realtime Database特点

  • 云端JSON格式数据库
  • 实时同步到每个客户端

漏洞发现

  1. 逆向APK查找数据库URL
    databaseUrl = "https://" + app.getOptions().getProjectId() + "-default-rtdb.firebaseio.com";
    
  2. 在字符串资源中查找ProjectId
  3. 直接访问数据库URL测试权限

风险场景

  • 开发者未正确配置Firebase Security Rules
  • 数据库可被公共读写

实际案例

  • 多个知名应用的Firebase数据库泄露事件

2.4 不安全SharedPreferences

SharedPreferences特点

  • 存储少量键值对数据
  • 默认存储在/data/data/<package_name>/shared_prefs/
  • 需要Root权限查看

历史漏洞

  • MODE_WORLD_READABLEMODE_WORLD_WRITEABLE模式
  • 已在Android 4.2废弃

当前风险

  • 即使使用MODE_PRIVATE,明文存储密码仍不安全

2.5 SQL注入

漏洞原理

  • 用户输入直接拼接到SQL语句
  • 典型Payload:' or true or '

防护措施

  • 使用参数化查询
  • 使用ORM框架

实际案例

  • NextCloud Android App Content Provider SQL注入(CVE-2019-5454)

Drozer检测

drozer console connect
run scanner.provider.injection -a com.nextcloud.client

2.6 Content Provider漏洞

Content Provider介绍

  • Android四大组件之一
  • 允许应用间数据共享

漏洞类型

  1. 导出Provider未做权限控制
  2. 未校验输入导致SQL注入

攻击方法

adb shell content query --uri "content://target.provider"

2.7 PIN码绕过

漏洞原理

  • 验证逻辑在客户端完成
  • 可Hook验证方法直接返回true

Frida脚本

Java.perform(() => {
    const PinBypass = Java.use("infosecadventures.allsafe.challenges.PinBypass");
    PinBypass.checkPin.implementation = () => { return true; }
});

Objection方法

objection -g infosecadventures.allsafe explore --startup-command "android hooking set return_value infosecadventures.allsafe.challenges.PinBypass.checkPin true"

2.8 Root检测绕过

常见检测库

  • RootBeer

绕过方法

objection -g infosecadventures.allsafe explore --startup-command "android hooking set return_value com.scottyab.rootbeer.RootBeer.isRooted false"

2.9 Deep Link漏洞

Deep Link介绍

  • 通过特定URL直接跳转到应用内页面
  • 需在AndroidManifest.xml配置:
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="demo" />
    </intent-filter>
    

漏洞利用

  1. 查找应用中的Deep Link配置
  2. 构造恶意链接:
    <a href="demo://anything/anything">test</a>
    
    adb shell am start -W -a android.intent.action.VIEW -d "demo://anything/anything"
    

风险场景

  • 未校验Intent数据导致WebView任意URL加载
  • 敏感信息泄露

2.10 Broadcast Receiver漏洞

Broadcast Receiver介绍

  • Android四大组件之一
  • 用于应用间通信

漏洞类型

  1. 敏感广播被其他应用接收
  2. 接收未校验的广播导致权限绕过

攻击方法

Intent intent = new Intent();
intent.setAction("target.action");
intent.putExtra("sensitive_data", "leaked_info");
sendBroadcast(intent);

防护建议

  • 使用LocalBroadcastManager限制广播范围
  • 校验广播发送者权限

2.11 WebView漏洞

常见风险配置

webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);

漏洞利用

  1. XSS攻击:<button onclick="alert(1)">alert</button>
  2. 本地文件读取:file:///etc/hosts

防护措施

  • 严格限制URL白名单
  • 禁用不必要的JavaScript和文件访问

2.12 SSL Pinning绕过

SSL Pinning原理

  • 固定信任特定证书或公钥
  • 防止中间人攻击

绕过方法

  1. Frida脚本:
    frida -U -f target.app --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida
    
  2. Objection:
    objection -g target.app explore --startup-command "android sslpinning disable"
    

证书导入(Android 13)

openssl x509 -inform DER -in cacert.der -out cacert.pem
HASH=`openssl x509 -subject_hash_old -in cacert.pem | head -1`
cp cacert.pem "${HASH}.0"
adb push "${HASH}.0" /system/etc/security/cacerts

2.13 弱加密算法

检测方法

  • 逆向分析加密算法实现
  • Frida Hook加密函数

Frida脚本示例

frida -U -f target.app --codeshare fadeevab/intercept-android-apk-crypto-operations

2.14 不安全Service

Service介绍

  • Android四大组件之一
  • 实现后台运行

漏洞场景

  • 导出Service未做权限控制
  • 允许外部应用调用敏感功能

攻击方法

Intent intent = new Intent();
intent.setComponent(new ComponentName("target.pkg", "target.Service"));
startForegroundService(intent);

2.15 不安全Content Provider

FileProvider风险

  • android:grantUriPermissions="true
  • 结合导出Activity可实现权限提升

攻击链

  1. 找到导出ProxyActivity
  2. 构造Intent授予临时权限
  3. 读取目标Provider数据

2.16 任意代码执行

漏洞场景

  1. createPackageContext不安全使用
    createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY|Context.CONTEXT_INCLUDE_CODE)
    
  2. 从外部APK动态加载代码

防护建议

  • 避免动态加载不可信代码
  • 严格校验上下文创建参数

2.17 Native层Hook

分析方法

  1. 解压APK获取so文件
  2. 使用Ghidra分析
  3. 查找JNI函数:
    Java_package_name_class_name_method

Frida Hook示例

const module = Process.findModuleByName("libnative.so");
const funAddr = module.getExportByName("Java_pkg_class_method");
Interceptor.attach(funAddr, {
    onEnter: function(args) {
        console.log(env.getStringUtfChars(args[2]).readCString());
    },
    onLeave: function(retval) {
        retval.replace(1);
    }
});

2.18 Smali代码修改

修改流程

  1. 反编译APK:
    apktool d target.apk
    
  2. 修改smali文件
  3. 重打包:
    apktool b target -o new.apk
    
  4. 对齐和签名:
    zipalign 4 new.apk new_aligned.apk
    apksigner sign --ks keystore --ks-key-alias alias new_aligned.apk
    

3. 防御措施总结

3.1 开发规范

  • 避免日志输出敏感信息
  • 禁止硬编码凭证
  • 使用安全的存储方式

3.2 组件安全

  • 谨慎设置组件导出属性
  • 严格校验输入数据
  • 使用适当的权限控制

3.3 网络安全

  • 实施SSL Pinning
  • 使用安全的网络通信协议
  • 服务器端做好输入验证

3.4 代码安全

  • 避免动态加载不可信代码
  • Native代码做好混淆和保护
  • 定期进行安全审计

4. 学习资源

4.1 推荐书籍

  • 《第一行代码:Android》
  • 《Android应用安全实战:Frida协议分析》

4.2 在线资源

  • Android开发者文档
  • HackerOne漏洞报告
  • 先知社区技术文章

4.3 进阶靶场

  • InsecureShop
  • ovaa
  • Frida-Labs
Android应用安全实战:漏洞靶场学习指南 1. 测试环境搭建 1.1 硬件与软件配置 硬件 :ARM版MacBook 模拟器 :Android Studio自带虚拟机 系统镜像 :Android 14.0 (Default Android System Image) 特点 :不带Google Play的镜像可直接获得Root权限,支持Frida 1.2 工具准备 逆向工具 :jadx-gui 动态分析工具 :Frida、Objection 抓包工具 :BurpSuite 其他工具 :Apktool、Drozer 2. 常见Android漏洞类型与实战 2.1 不安全日志记录 (Insecure Logging) 漏洞原理 开发中常使用日志输出调试信息,可能泄露敏感数据 通过 adb logcat 可查看应用日志 靶场示例 实际案例 BitCoin Wallet在日志中输出OAuth响应 安全限制 Android 4.1之前可通过 READ_LOGS 权限读取 新版本已限制该权限,风险降低 2.2 硬编码凭证 (Hardcoded Credentials) 漏洞原理 将敏感信息如账号密码硬编码在应用中 分析方法 使用jadx-gui逆向APK 查找Fragment或Activity相关代码 定位硬编码的凭证 实际案例 多个HackerOne报告中的硬编码密钥、API KEY问题 防护建议 避免在代码中存储敏感信息 使用Android Keystore系统 2.3 Firebase数据库配置错误 Firebase Realtime Database特点 云端JSON格式数据库 实时同步到每个客户端 漏洞发现 逆向APK查找数据库URL 在字符串资源中查找ProjectId 直接访问数据库URL测试权限 风险场景 开发者未正确配置Firebase Security Rules 数据库可被公共读写 实际案例 多个知名应用的Firebase数据库泄露事件 2.4 不安全SharedPreferences SharedPreferences特点 存储少量键值对数据 默认存储在 /data/data/<package_name>/shared_prefs/ 需要Root权限查看 历史漏洞 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 模式 已在Android 4.2废弃 当前风险 即使使用 MODE_PRIVATE ,明文存储密码仍不安全 2.5 SQL注入 漏洞原理 用户输入直接拼接到SQL语句 典型Payload: ' or true or ' 防护措施 使用参数化查询 使用ORM框架 实际案例 NextCloud Android App Content Provider SQL注入(CVE-2019-5454) Drozer检测 2.6 Content Provider漏洞 Content Provider介绍 Android四大组件之一 允许应用间数据共享 漏洞类型 导出Provider未做权限控制 未校验输入导致SQL注入 攻击方法 2.7 PIN码绕过 漏洞原理 验证逻辑在客户端完成 可Hook验证方法直接返回true Frida脚本 Objection方法 2.8 Root检测绕过 常见检测库 RootBeer 绕过方法 2.9 Deep Link漏洞 Deep Link介绍 通过特定URL直接跳转到应用内页面 需在AndroidManifest.xml配置: 漏洞利用 查找应用中的Deep Link配置 构造恶意链接: 或 风险场景 未校验Intent数据导致WebView任意URL加载 敏感信息泄露 2.10 Broadcast Receiver漏洞 Broadcast Receiver介绍 Android四大组件之一 用于应用间通信 漏洞类型 敏感广播被其他应用接收 接收未校验的广播导致权限绕过 攻击方法 防护建议 使用LocalBroadcastManager限制广播范围 校验广播发送者权限 2.11 WebView漏洞 常见风险配置 漏洞利用 XSS攻击: <button onclick="alert(1)">alert</button> 本地文件读取: file:///etc/hosts 防护措施 严格限制URL白名单 禁用不必要的JavaScript和文件访问 2.12 SSL Pinning绕过 SSL Pinning原理 固定信任特定证书或公钥 防止中间人攻击 绕过方法 Frida脚本: Objection: 证书导入(Android 13) 2.13 弱加密算法 检测方法 逆向分析加密算法实现 Frida Hook加密函数 Frida脚本示例 2.14 不安全Service Service介绍 Android四大组件之一 实现后台运行 漏洞场景 导出Service未做权限控制 允许外部应用调用敏感功能 攻击方法 2.15 不安全Content Provider FileProvider风险 android:grantUriPermissions="true 结合导出Activity可实现权限提升 攻击链 找到导出ProxyActivity 构造Intent授予临时权限 读取目标Provider数据 2.16 任意代码执行 漏洞场景 createPackageContext 不安全使用 从外部APK动态加载代码 防护建议 避免动态加载不可信代码 严格校验上下文创建参数 2.17 Native层Hook 分析方法 解压APK获取so文件 使用Ghidra分析 查找JNI函数: Java_package_name_class_name_method Frida Hook示例 2.18 Smali代码修改 修改流程 反编译APK: 修改smali文件 重打包: 对齐和签名: 3. 防御措施总结 3.1 开发规范 避免日志输出敏感信息 禁止硬编码凭证 使用安全的存储方式 3.2 组件安全 谨慎设置组件导出属性 严格校验输入数据 使用适当的权限控制 3.3 网络安全 实施SSL Pinning 使用安全的网络通信协议 服务器端做好输入验证 3.4 代码安全 避免动态加载不可信代码 Native代码做好混淆和保护 定期进行安全审计 4. 学习资源 4.1 推荐书籍 《第一行代码:Android》 《Android应用安全实战:Frida协议分析》 4.2 在线资源 Android开发者文档 HackerOne漏洞报告 先知社区技术文章 4.3 进阶靶场 InsecureShop ovaa Frida-Labs