外部程序调用Activity的几种方法总结

1. 组件导出

activity 组件导出可以使用外部程序调用我们的Activity

  1. 组件的属性是 android:exported 属性的值 = “true”
  2. Activity 的权限的属性值是空,normal, dangerous 是不安全的 即 android:permission = null,normal, dangerous

这个时候可以使用外部的程序来调用我们的activity

1.1 启动方式

1.1.1adb shell am 启动

比如用 adb shell am start -n /

格式:
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-c category,-e 扩展数据,等)。

e.g.,

adb shell am start -n it.sendto.android.client/.MainActivity -a android.intent.action.VIEW

Activity启动命令

先来介绍一下启动Activity命令am start [options] 使用options参数,接下来列举Activity命令的[options]参数:

-D: 允许调试功能
-W: 等待app启动完成
-R : 重复启动Activity COUNT次
-S: 启动activity之前,先调用forceStopPackage()方法强制停止app. –opengl-trace: 运行获取OpenGL函数的trace –user <USER_ID> | current: 指定用户来运行App,默认为当前用户。
–start-profiler : 启动profiler,并将结果发送到 ;
-P : 类似 –start-profiler,不同的是当app进入idle状态,则停止profiling –sampling INTERVAL: 设置profiler 取样时间间隔,单位ms; 启动Activity的实现原理:
存在-W参数则调用startActivityAndWait()方法来运行,否则startActivityAsUser()。

am 启动intent

Intent参数
Intent的参数和flags较多,本文为方便起见,分为3种类型参数,常用参数,Extra参数,Flags参数。

常用参数
-a : 指定Intent action, 实现原理Intent.setAction();
-n : 指定组件名,格式为{包名}/.{主Activity名},实现原理Intent.setComponent();
-d <DATA_URI>: 指定Intent data URI
-t <MIME_TYPE>: 指定Intent MIME Type
-c [-c ] …]:指定Intent category,实现原理Intent.addCategory()
-p : 指定包名,实现原理Intent.setPackage();
-f : 添加flags,实现原理Intent.setFlags(int ),紧接着的参数必须是int型;

1.1.2 monkeyrunner 启动

device = MonkeyRunner.waitForConnection()
 
MonkeyRunner.sleep(1)
 
runComponent = package + '/' + activity
 
action = 'android.intent.action.MAIN'
 
device.startActivity(action = action, component = runComponent)
 




2. 利用 Intent-based 攻击检测

在AndroidManifest.xml 文件中定义了activity的 android.intent.category.BROWSABLE属性的组件,这个时候可以通过浏览器唤起我们的Activity,这可以执行远程的命令执行漏洞攻击。

Activity 的 category filter 设置了 android.intent.category.BROWSABLE通过这种方式在浏览器中打开。

通过扫描Minifest中的所有组件,检测出所有组件有中intent-filter带有属性的,将其标注为问题代码代码段,并报出低危风险的提示。

<activity android:name=".MainActivity">
    <intent-filter>
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

建议:

APP中任何接收外部输入数据的地方都是潜在的攻击点,检查并过滤来自网页的参数
不要通过网页传输敏感信息,有的网站为了引导已经登录的用户到APP上使用,会使用脚本动态的生成URL Scheme的参数,其中包括了用户名、密码或者登录态token等敏感信息,让用户打开APP直接就登录了。恶意应用也可以注册相同的URL Sechme来截取这些敏感信息。Android系统会让用户选择使用哪个应用打开链接,但是如果用户不注意,就会使用恶意应用打开,导致敏感信息泄露或者其他风险。



3. 利用intent scheme URL 漏洞 启动Activity

Intent Scheme URI是一种特殊的URL格式,用来通过Web页面启动已安装应用的Activity组件,大多数主流浏览器都支持此功能。

Android Browser的攻击手段——Intent Scheme URLs攻击。这种攻击方式利用了浏览器保护措施的不足,通过浏览器作为桥梁间接实现Intend-Based攻击。相比于普通Intend-Based攻击,这种方式极具隐蔽性,

如果在app中,没有检查获取到的load_url的值,攻击者可以构造钓鱼网站,诱导用户点击加载,就可以盗取用户信息。所以,对Intent URI的处理不当时,就会导致基于Intent的攻击。

风险等级:高危

问题示例:

如果浏览器支持Intent Scheme URI语法,一般会分三个步骤进行处理:

利用Intent.parseUri解析uri,获取原始的intent对象
对intent对象设置过滤规则
通过Context.startActivityIfNeeded或者Context.startActivity发送intent;其中步骤2起关键作用,过滤规则缺失或者存在缺陷都会导致Intent Schem URL攻击
关键在于Intent.parseUri函数,比较安全的使用Intent Scheme URI方法是,如果使用了Intent.parseUri函数,获取的intent必须严格过滤,intent至少包含以下三个策略:

addCategory("android.intent.category.BROWSABLE")
setComponent(null)
setSelector(null)

通过扫描出所有调用了Intent.parseUri方法的路径,并检测是否使用上述的三个策略。若三者均使用则认为安全,否则需要标注为高危

// convert intent scheme URL to intent object  
Intent intent = Intent.parseUri(uri); 

// forbid launching activities without BROWSABLE category  
intent.addCategory("android.intent.category.BROWSABLE");  

// forbid explicit call  
intent.setComponent(null); 

// forbid intent with selector intent  
intent.setSelector(null);  

// start the activity by the intent  
context.startActivityIfNeeded(intent, -1)


Intent intent_2 = Intent.parseUri(uri); 


写在后面的话

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程https://www.captainbed.net/chichoxian

喜欢的朋友们,你们自己来吧,我一点都不会反抗。。。。。
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值