Deep Link:开放重定向

什么是Deep Link?

DeepLink是可以访问特定内容的链接。大多数网络链接都是深层链接。

如下所示

img

image by branch.io

在 Android 中,deeplink是直接带到应用程序内的特定位置的链接。

Android 中的Deep Link类型

Android 中有两种类型的Deep Link,分为显示Deep Link和隐式Deep Link。

显式Deep Link

显式Deep Link是Deep Link的单个实例,它使用PendingIntent将用户带到应用程序中的特定位置。

显式深层链接是由同一应用程序创建的深层链接,单击后会直接带到应用程序内的内容。
例如:通知或应用程序小部件

img

img

隐式Deep Link

隐式Deep Link是指调用Deep Link时应用程序中的特定目标。

隐式Deep Link是 URI 形式的深层链接,单击后会将您直接带到相关应用程序中的内容。

例如:当用户单击链接时,Android 可以将您的应用程序打开到相应的目的地(Play 商店链接)。

img

Android 中的深层链接

所有与 android 相关的深层链接都存储在AndroidManifest.xml文件中。

要创建指向应用内容的深层链接,需要将包含元素和属性值的意图过滤器添加到 AndroidManifest.xml 文件中。

在讨论元素和属性之前,让我们先看看什么是Intent 过滤器。

Intent是一个传递来启动活动或让现有活动做一些新事情的对象。

Intent filter过滤器描述组件的功能(如活动、服务和广播接收器)

Intent 是一个消息传递对象,可以使用它从一个应用程序组件向另一应用程序组件请求操作。尽管意图以多种方式促进组件之间的通信,但有三种基本用例:

  • 开始活动

“Activity”表示应用程序中的单个屏幕。您可以通过向startActivity()传递Intent来启动一个新的Activity实例。意向描述了要启动的活动,并携带了任何必要的数据。

  • 启动服务

服务是在没有用户界面的情况下在后台执行操作的组件。使用Android5.0(API 21级)及更高版本,您可以使用JobScheduler启动服务。

对于Android5.0(API 21级)之前的版本,您可以使用service类的方法启动服务。您可以通过传递Intent to startService()来启动服务以执行一次性操作(例如下载文件)。

  • 传送广播

广播是任何应用程序都可以接收的消息。系统为系统事件提供各种广播,例如当系统启动或设备开始充电时。您可以通过将Intent传递给sendBroadcast()或sendOrderedBroadcast.()将广播传递给其他应用程序。

下面的XML片段显示了如何在清单中为深度链接指定意向过滤器。URI“example://gizmos“和”http://www.example.com/gizmos“

img
在上图中,我们可以看到活动的deep link。

  1. URI“example://gizmos”和“http://www.example.com/gizmos”都解析为**”com.example.android.GizmosActivity”**的活动。
  2. Intent-filter根据URI的类型定义活动组件的能力。
  3. 指定ACTION_VIEW意图操作,以便可以从 Google、DuckDuckGo 或任何其他搜索引擎访问意图过滤器。
  4. 包括BROWSABLE类别。为了能够从 Web 浏览器访问意图过滤器,这是必需的。如果没有它,单击浏览器中的链接将无法解析到您的应用程序。

还包括DEFAULT类别。这允许您的应用程序响应隐式意图。如果没有这个,只有当意图指定您的应用程序组件名称时才能启动活动。

\5. 添加一个或多个标签,每个标签代表解析为活动的 URI 格式。标签至少必须包含该android:scheme属性。

您可以添加更多属性来进一步细化活动接受的 URI 类型。例如,您可能有多个接受类似 URI 的活动,但它们的不同之处仅在于路径名。在这种情况下,请使用该android:path属性或其pathPattern变pathPrefix体来区分系统应为不同的 URI 路径打开哪个活动。

DeepLink:开放/未经验证的重定向

演示时间

在本演示中,我们将使用名为InsecureShop的故意存在漏洞的 Android 应用程序。

由于我们了解到 Android 中并非所有深层链接都存储在 AndroidManifest.xml 文件中,因此让我们首先在jadx-gui中打开 apk来读取Manifest.xml。

从上图中,我们现在知道 DeepLink 将根据意图过滤器中定义的数据标签进行处理,即android:scheme必须存在。

android:scheme因此,让我们在清单文件中搜索,可以看到我们只找到了 1 个deeplink。

img

从上图中我们可以webview通过查看活动名称来了解深层链接的调用。如果您不记得 webview 是什么,请查看此处

上面的 uri 将类似于insecureshop://com.insecureshop 调用 webview 活动的 uri。在 Jadx 中,按住ctrl并单击活动名称以在新选项卡中打开代码。

img

  1. onCreate()是Android中的一个生命周期事件。Android 的 Activity 生命周期中有 6 个核心生命周期事件集onCreate()onStart()onResume()onPause()onStop()、 ,onDestroy()它们是不言自明的。
  2. webview定义的 webview 活动的设置。
  3. getIntent()获取意图并存储在intent object.
  4. intent.getData()获取 uri 并存储uri object并检查 uri 是否为空。

img

img

  1. 检查路径(如果有/web)并执行相应的代码。
  2. 检查路径(如果有/webview)并执行相应的代码。
  3. 如果两次检查都失败且 webview 不会被加载,则完成检查。

如果 1 或 2 通过,它将获取 uri 并从查询中提取值url并将其存储在data变量中,并通过 webview 加载。

从上图中,我们将尝试完成uri以在webview中加载任意网页。

insecureshop://com.insecureshop/web?url=https://3kal.medium.com****(或者)

insecureshop://com.insecureshop/webview?url=https://3kal.medium.com

我们将使用ADB我们的 uri 来启动 webview,并且我们需要登录到insecureshop应用程序。

如果您找不到凭据,那么就是这里shopuser:!ns3csh0p****,需要登录后,页面如下所示。

img

使用 ADB,我们通过将 uri 作为数据传递给它来启动 webview 活动。

adb shell am start -W -a android.intent.action.VIEW -d “insecureshop://com.insecureshop/web?url=https://3kal.medium.com

Webview加载任意uri如下所示:

img

有很多问题可以通过深层链接来利用,我们将在以后的文章中看到。

LINK

https://medium.com/mobis3c/deep-link-exploitation-introduction-open-unvalidated-redirection-b8344f00b17b