Intent 参数是什么?Android 四大组件必备通信机制详解 + 安全要点

Intent 参数是什么?Android 四大组件必备通信机制详解 + 安全要点

🔐 Android 中的 Intent 参数传递机制与安全审计全解析

📌 Intent 是什么?

在 Android 中,Intent 是各个组件之间进行通信的核心机制。无论是启动一个 Activity、唤起一个 Service、还是广播事件,几乎所有的系统组件调用,底层都是通过 Intent 来实现参数传递和调度的。

通俗理解:Intent 就是 Android 的“快递单”或“信封”,可以塞参数进去、指定投递地址,再交给系统分发。

Intent 的参数传递逻辑

当你写一个组件(比如 Service)的入口方法长这样:

 public void onStartCommand(Intent intent, int flags, int startId)

或者在 IntentService 中:

 protected void onHandleIntent(Intent intent)

你就可以通过:

 String value = intent.getStringExtra("key");

来获取从外部传进来的参数。

🔁 对应到 ADB 命令是这样的:

 adb shell am startservice -n com.example.vuln/.YourService --es key "value"

🔍 实际等价于 Java 中执行了:

 Intent intent = new Intent();
 intent.putExtra("key", "value");
 startService(intent);

然后你的服务代码中就能拿到:

 String value = intent.getStringExtra("key");  // value = "value"

🧪 举个列子:命令执行漏洞

假设你写了一个导出服务类:

 public class ExecService extends Service {
     public int onStartCommand(Intent intent, int flags, int startId) {
         String cmd = intent.getStringExtra("cmd");
         Runtime.getRuntime().exec(cmd);
         return START_NOT_STICKY;
     }
 }

对应的 ADB 利用命令就是:

 adb shell am startservice -n com.example.vuln/.ExecService --es cmd "ls /sdcard/"

📋 Intent 参数传递类型 & 安全审计对照表

类型传递方式示例Java 接收方法审计要点
字符串--es key "val"getStringExtra("key")是否拼接进敏感函数,如命令、SQL
整型--ei key 123getIntExtra("key", def)是否用作数组索引、循环计数
布尔值--ez key truegetBooleanExtra("key", def)控制逻辑分支?绕过校验?
BundlegetExtras()是否存储多个参数,需深入检查
URIIntent.setData(Uri.parse("content://..."))getData()用于文件/资源操作?可被滥用?
Component NamesetComponent(...)getComponent()指定调用目标组件?是否越权调用?

☠️ 常见漏洞类型与审计要点

漏洞类型意图参数例子漏洞特征审计关键点
命令执行 RCE--es cmd "rm -rf /sdcard"参数拼接进 exec()Runtime.getRuntime().exec(...)
SQL 注入--es name "' OR 1=1 --"SQL 拼接语句中使用 Intent 参数rawQuery, + 参数 +
权限绕过--es pkg "com.android.settings"使用了敏感 API 而无调用者校验getCallingUid() 缺失
服务滥用重复调用 startService()消耗资源导致 ANR、DoS是否限制调用频率
信息泄露bindService() 后调用敏感 Binder 方法exported=true 且返回敏感信息是否权限控制、是否对调用方校验

🚀 ADB 快速利用命令对照表

场景ADB 命令
命令执行(RCE)adb shell am startservice -n com.vuln/.ExecService --es cmd "id"
SQL 注入adb shell am startservice -n com.vuln/.QueryService --es name "' OR 1=1 --"
权限绕过删除应用adb shell am startservice -n com.vuln/.DeleteAppService --es pkg "com.xxx"
触发大量计算卡顿adb shell am startservice -n com.vuln/.HeavyService

✅ 总结

Android 四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之间的通信,核心就是通过 Intent 实现的——除了 ContentProvider 用的是 ContentResolver 模式,其余三个组件主要都靠 Intent 来传递数据和发起调用。

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容