0x05 Intent URL Scheme安全
1、漏洞原理
基于Android Browser的攻击手段;利用了浏览器通过web页面启动已安装应用的activity时,由于浏览器对Intent URL的处理不当,恶意用户可以通过js代码进行一些恶意行为。
2、相关知识
-
Intent schema URL的用法
eg1:
<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");
eg2:
intent://foobar/#Intent;action=myaction;type=text/plain;S.xyz=123;i.abc=678;end
等价于:
Intent intent = new Intent("myaction");
intent.setData(Uri.parse("//foobar/"));
intent.setType(text/plain);
intent.putExtra("xyz","123");
intent.putExtra("abc",678);
-
intent schema url解析及过滤过程
-
1-利用intent.parseUri解析uri,获取原始的intent对象
-
2-对intent对象设置过滤规则,不同的浏览器有不同策略;(关键)
-
3-通过Context.startActivityIfNeeded或者Context.startActivity发送intent;
当第二步的过滤规则缺少或存在缺陷都会导致Intent Schema URL攻击。
-
-
各大浏览器对Intent scheme URL的支持情况
只有firefox不支持Intent scheme URL语法。
3、检测方法
-
先检索到
Intent.parseUri()
-
查看是否缺失过滤规则
Intent.addCategory(“android.intent.category.BROWSABLE”)
Intent.setComponent(null)
Intent.setSelector(null)
4、漏洞危害
-
盗取cookie
-
漏洞示例——Opera Browser cookie盗取
当Opera的intent过滤策略是完全缺失的,我们可以调用Opera上的私有activity。payload:
<script> location.href="intent:#Intent;S.url=file:///data/data/com.opera.browser/app_opera/cookies;component=com.opera.browser/com.admarvel.android.ads.AdMarvelActivity;end"; </script>
通过这个脚本可以直接调起AdMarvelActivity。AdMarvelActivity会从intent中获取url,并以HTML/JavaScript方式解析cookies文件。
构造恶意网页让受害者访问,此时页面的脚本应该是:
当AdMarvelActivity解析cookies文件时,就会执行payload。
-
-
UXSS
- https://blog.csdn.net/l173864930/article/details/36951805?spm=a313e.7916648.0.0.28c26611Ag1xh8
5、修复方案
-
自定义Schema打开app
-
构建URL Schema白名单
-
URL Schema组件的安全性
- 将Intent Schema URL转换为Intent对象。
Intent intent = Intent.parseUri(uri)。
- 将Intent Schema URL转换为Intent对象。
-
禁止发起没有BROWSABLE category的Activity。
intent.addCategory(“android.intent.category.BROWSABLE”)。- 禁止显式调用
intent.setComponent(null)。 - 禁止使用intent Selector
intent.setComponent(null);
- 禁止显式调用
-
禁止使用带intent Selector的intent。
intent.setSelector(null)。- 只能通过intent启动特定的Activity
context.startActivityIfNeeded(intent, -1)。
- 只能通过intent启动特定的Activity
6、其他参考
intent.setSelector(null)。
- 只能通过intent启动特定的Activity
context.startActivityIfNeeded(intent, -1)。
6、其他参考
https://zhuanlan.zhihu.com/p/23109883