hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md

7.6 KiB
Raw Blame History

零基础学习AWS黑客攻击直至成为专家通过 htARTE (HackTricks AWS 红队专家)!

支持HackTricks的其他方式:

通用链接允许直接将用户重定向到应用程序无需经过Safari进行重定向。
通用链接是独一无二的,因此其他应用无法认领因为它们使用标准的HTTP(S)链接到网站,网站所有者已上传文件以确保网站和应用程序相关
由于这些链接使用HTTP(S)方案,当应用未安装时Safari将打开链接,将用户重定向到页面。这允许应用程序即使未安装也能与应用程序通信

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

检查关联域名权限

在Xcode中转到功能标签并搜索关联域名。您也可以检查.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>

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

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

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

检索苹果应用站点关联文件

尝试使用您从上一步获取的关联域名从服务器检索apple-app-site-association文件。这个文件需要通过HTTPS访问地址为https://<domain>/apple-app-site-associationhttps://<domain>/.well-known/apple-app-site-association,且不经过任何重定向。

您可以使用浏览器自行检索,或使用苹果应用站点关联AASA验证器

检查链接接收方法

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

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

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

检查数据处理方法

当iOS因通用链接打开应用时应用会收到一个带有NSUserActivityTypeBrowsingWeb值的NSUserActivity对象。活动对象的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" %}

通过 htARTE (HackTricks AWS Red Team Expert)从零开始学习AWS黑客技术

支持HackTricks的其他方式