Deep Link:开放重定向
什么是Deep Link?
DeepLink是可以访问特定内容的链接。大多数网络链接都是深层链接。
如下所示
image by branch.io
在 Android 中,deeplink是直接带到应用程序内的特定位置的链接。
Android 中的Deep Link类型
Android 中有两种类型的Deep Link,分为显示Deep Link和隐式Deep Link。
显式Deep Link
显式Deep Link是Deep Link的单个实例,它使用PendingIntent将用户带到应用程序中的特定位置。
显式深层链接是由同一应用程序创建的深层链接,单击后会直接带到应用程序内的内容。
例如:通知或应用程序小部件
隐式Deep Link
隐式Deep Link是指调用Deep Link时应用程序中的特定目标。
隐式Deep Link是 URI 形式的深层链接,单击后会将您直接带到相关应用程序中的内容。
例如:当用户单击链接时,Android 可以将您的应用程序打开到相应的目的地(Play 商店链接)。
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“
在上图中,我们可以看到活动的deep link。
- URI“example://gizmos”和“http://www.example.com/gizmos”都解析为**”com.example.android.GizmosActivity”**的活动。
- Intent-filter根据URI的类型定义活动组件的能力。
指定ACTION_VIEW意图操作,以便可以从 Google、DuckDuckGo 或任何其他搜索引擎访问意图过滤器。 包括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。
从上图中我们可以webview通过查看活动名称来了解深层链接的调用。如果您不记得 webview 是什么,请查看此处。
上面的 uri 将类似于insecureshop://com.insecureshop 调用 webview 活动的 uri。在 Jadx 中,按住ctrl并单击活动名称以在新选项卡中打开代码。
- onCreate()是Android中的一个生命周期事件。Android 的 Activity 生命周期中有 6 个核心生命周期事件集onCreate()、onStart()、onResume()、onPause()、onStop()、 ,onDestroy()它们是不言自明的。
- webview定义的 webview 活动的设置。
- getIntent()获取意图并存储在intent object.
- intent.getData()获取 uri 并存储uri object并检查 uri 是否为空。
- 检查路径(如果有/web)并执行相应的代码。
- 检查路径(如果有/webview)并执行相应的代码。
- 如果两次检查都失败且 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****,需要登录后,页面如下所示。
使用 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如下所示:
有很多问题可以通过深层链接来利用,我们将在以后的文章中看到。