通过漏洞靶场学习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)
漏洞原理
- 将敏感信息如账号密码硬编码在应用中
分析方法
- 使用jadx-gui逆向APK
- 查找Fragment或Activity相关代码
- 定位硬编码的凭证
实际案例
- 多个HackerOne报告中的硬编码密钥、API KEY问题
防护建议
- 避免在代码中存储敏感信息
- 使用Android Keystore系统
2.3 Firebase数据库配置错误
Firebase Realtime Database特点
- 云端JSON格式数据库
- 实时同步到每个客户端
漏洞发现
- 逆向APK查找数据库URL
databaseUrl = "https://" + app.getOptions().getProjectId() + "-default-rtdb.firebaseio.com"; - 在字符串资源中查找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检测
drozer console connect
run scanner.provider.injection -a com.nextcloud.client
2.6 Content Provider漏洞
Content Provider介绍
- Android四大组件之一
- 允许应用间数据共享
漏洞类型
- 导出Provider未做权限控制
- 未校验输入导致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>
漏洞利用
- 查找应用中的Deep Link配置
- 构造恶意链接:
或<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四大组件之一
- 用于应用间通信
漏洞类型
- 敏感广播被其他应用接收
- 接收未校验的广播导致权限绕过
攻击方法
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);
漏洞利用
- XSS攻击:
<button onclick="alert(1)">alert</button> - 本地文件读取:
file:///etc/hosts
防护措施
- 严格限制URL白名单
- 禁用不必要的JavaScript和文件访问
2.12 SSL Pinning绕过
SSL Pinning原理
- 固定信任特定证书或公钥
- 防止中间人攻击
绕过方法
- Frida脚本:
frida -U -f target.app --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida - 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可实现权限提升
攻击链
- 找到导出ProxyActivity
- 构造Intent授予临时权限
- 读取目标Provider数据
2.16 任意代码执行
漏洞场景
createPackageContext不安全使用createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY|Context.CONTEXT_INCLUDE_CODE)- 从外部APK动态加载代码
防护建议
- 避免动态加载不可信代码
- 严格校验上下文创建参数
2.17 Native层Hook
分析方法
- 解压APK获取so文件
- 使用Ghidra分析
- 查找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代码修改
修改流程
- 反编译APK:
apktool d target.apk - 修改smali文件
- 重打包:
apktool b target -o new.apk - 对齐和签名:
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