hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md
2023-08-03 19:12:22 +00:00

8.5 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

通用链接允许直接将用户重定向到应用程序而无需通过Safari进行重定向。
通用链接是唯一的,因此它们不能被其他应用程序占用因为它们使用标准的HTTP(S)链接到所有者上传文件的网站,以确保网站和应用程序相关
由于这些链接使用HTTP(S)协议,当应用程序未安装时Safari将打开链接,将用户重定向到页面。这使得应用程序可以与未安装的应用程序进行通信

要创建通用链接,需要创建一个名为apple-app-site-association的JSON文件,其中包含详细信息。然后,将此文件托管在您的Web服务器的根目录中(例如https://google.com/apple-app-site-association)。
对于渗透测试人员来说,这个文件非常有趣,因为它公开了路径。它甚至可以公开尚未发布的版本的路径。

检查关联域权利

在Xcode中转到Capabilities选项卡,搜索关联域。您还可以检查.entitlements文件,查找com.apple.developer.associated-domains。每个域名都必须以applinks:为前缀,例如applinks:www.mywebsite.com

以下是Telegram的.entitlements文件的示例:

<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>

更详细的信息可以在存档的Apple开发者文档中找到。

如果你只有编译后的应用程序,可以按照这个指南提取权限:

{% content-ref url="extracting-entitlements-from-compiled-application.md" %} extracting-entitlements-from-compiled-application.md {% endcontent-ref %}

检索Apple App Site Association文件

尝试使用前一步骤获取的关联域名从服务器检索apple-app-site-association文件。该文件需要通过HTTPS访问没有任何重定向位于https://<domain>/apple-app-site-associationhttps://<domain>/.well-known/apple-app-site-association

您可以使用浏览器自己检索,或使用Apple App Site Association (AASA) Validator

检查链接接收方法

为了接收链接并适当处理它们,应用委托必须实现application:continueUserActivity:restorationHandler:方法。如果您有原始项目,请尝试搜索此方法。

请注意,如果应用使用openURL:options:completionHandler:打开通往应用网站的通用链接,链接将不会在应用中打开。由于调用源自应用,它不会被处理为通用链接。

  • webpageURL的方案必须是HTTP或HTTPS任何其他方案都应该抛出异常。可以使用URLComponents / NSURLComponentsscheme实例属性来验证这一点。

检查数据处理方法

当iOS作为通用链接的结果打开应用时应用会收到一个NSUserActivity对象,其activityType值为NSUserActivityTypeBrowsingWeb。活动对象的webpageURL属性包含用户访问的HTTP或HTTPS URL。以下Swift示例在打开URL之前验证了这一点

func application(_ application: UIApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// ...
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
application.open(url, options: [:], completionHandler: nil)
}

return true
}

此外请记住如果URL包含参数在进行仔细的清理和验证之前不应该信任它们即使来自可信域。例如它们可能已被攻击者伪造或者可能包含格式错误的数据。如果是这种情况整个URL以及通用链接请求必须被丢弃。

NSURLComponents API可用于解析和操作URL的组件。这也可以是application:continueUserActivity:restorationHandler:方法的一部分,或者可能在从该方法调用的单独方法中发生。以下示例演示了这一点:

func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
let path = components.path,
let params = components.queryItems else {
return false
}

if let albumName = params.first(where: { $0.name == "albumname" })?.value,
let photoIndex = params.first(where: { $0.name == "index" })?.value {
// Interact with album name and photo index

return true

} else {
// Handle when album and/or album name or photo index missing

return false
}
}

参考资料

{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥