零基础学习AWS黑客攻击直至成为专家,通过 htARTE (HackTricks AWS 红队专家)!
支持HackTricks的其他方式:
* 如果您想在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
通用链接允许**直接将用户重定向**到应用程序,无需经过Safari进行重定向。\
通用链接是**独一无二**的,因此**其他应用无法认领**,因为它们使用标准的HTTP(S)链接到**网站,网站所有者已上传文件以确保网站和应用程序相关**。\
由于这些链接使用HTTP(S)方案,当**应用未安装时,Safari将打开链接**,将用户重定向到页面。这允许**应用程序即使未安装也能与应用程序通信**。
要创建通用链接,需要**创建一个名为`apple-app-site-association`的JSON文件**,并填写详细信息。然后,需要将此文件**托管在您的Web服务器的根目录中**(例如[https://google.com/apple-app-site-association](https://google.com/apple-app-site-association))。\
对于渗透测试人员来说,这个文件非常有趣,因为它**泄露了路径**。它甚至可能泄露尚未发布的版本的路径。
## **检查关联域名权限**
在Xcode中,转到**功能**标签并搜索**关联域名**。您也可以检查`.entitlements`文件,寻找`com.apple.developer.associated-domains`。每个域名必须以`applinks:`为前缀,例如`applinks:www.mywebsite.com`。
以下是Telegram的`.entitlements`文件示例:
```markup
com.apple.developer.associated-domains
applinks:telegram.me
applinks:t.me
```
更多详细信息可以在[存档的苹果开发者文档](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2)中找到。
如果您只有编译后的应用程序,您可以按照以下指南提取权限:
{% content-ref url="extracting-entitlements-from-compiled-application.md" %}
[extracting-entitlements-from-compiled-application.md](extracting-entitlements-from-compiled-application.md)
{% endcontent-ref %}
## **检索苹果应用站点关联文件**
尝试使用您从上一步获取的关联域名从服务器检索`apple-app-site-association`文件。这个文件需要通过HTTPS访问,地址为`https:///apple-app-site-association` 或 `https:///.well-known/apple-app-site-association`,且不经过任何重定向。
您可以使用浏览器自行检索,或使用[苹果应用站点关联(AASA)验证器](https://branch.io/resources/aasa-validator/)。
## **检查链接接收方法**
为了接收链接并适当处理,应用代理必须实现[`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application)方法。如果您有原始项目,请尝试搜索此方法。
请注意,如果应用使用[`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc)打开到应用网站的通用链接,链接不会在应用中打开。由于调用来自应用,它不会被作为通用链接处理。
* `webpageURL`的方案必须是HTTP或HTTPS(任何其他方案应该抛出异常)。可以使用`URLComponents` / `NSURLComponents`的[`scheme`实例属性](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme)来验证这一点。
## **检查数据处理方法**
当iOS因通用链接打开应用时,应用会收到一个带有`NSUserActivityTypeBrowsingWeb`值的`NSUserActivity`对象。活动对象的`webpageURL`属性包含用户访问的HTTP或HTTPS URL。以下是Swift中的示例,用于在打开URL之前确切验证这一点:
```swift
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:` 本身的一部分,或者可能在从它调用的单独方法中发生。以下[示例](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935)演示了这一点:
```swift
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的其他方式:
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。