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

8.8 KiB

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :

Les liens universels permettent de rediriger les utilisateurs directement vers l'application sans passer par Safari pour la redirection.
Les liens universels sont uniques, donc ne peuvent pas être revendiqués par d'autres applications car ils utilisent des liens HTTP(S) standards vers le site web où le propriétaire a téléchargé un fichier pour s'assurer que le site web et l'application sont liés.
Comme ces liens utilisent des schémas HTTP(S), lorsque l'application n'est pas installée, Safari ouvrira le lien redirigeant les utilisateurs vers la page. Cela permet aux applications de communiquer avec l'application même si elle n'est pas installée.

Pour créer des liens universels, il est nécessaire de créer un fichier JSON appelé apple-app-site-association avec les détails. Ensuite, ce fichier doit être hébergé dans le répertoire racine de votre serveur web (par exemple https://google.com/apple-app-site-association).
Pour le pentester, ce fichier est très intéressant car il révèle des chemins. Il peut même révéler des chemins de versions qui n'ont pas encore été publiées.

Vérification de l'entitlement des domaines associés

Dans Xcode, allez dans l'onglet Capacités et recherchez Domaines associés. Vous pouvez également inspecter le fichier .entitlements à la recherche de com.apple.developer.associated-domains. Chacun des domaines doit être préfixé par applinks:, comme applinks:www.monwebsite.com.

Voici un exemple du fichier .entitlements de Telegram :

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

Des informations plus détaillées sont disponibles dans la Documentation Apple Developer archivée.

Si vous disposez uniquement de l'application compilée, vous pouvez extraire les droits en suivant ce guide :

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

Récupération du fichier Apple App Site Association

Essayez de récupérer le fichier apple-app-site-association depuis le serveur en utilisant les domaines associés que vous avez obtenus à l'étape précédente. Ce fichier doit être accessible via HTTPS, sans aucune redirection, à https://<domain>/apple-app-site-association ou https://<domain>/.well-known/apple-app-site-association.

Vous pouvez le récupérer vous-même avec votre navigateur ou utiliser le validateur Apple App Site Association (AASA).

Vérification de la méthode de réception de lien

Pour recevoir des liens et les gérer de manière appropriée, le délégué de l'application doit implémenter application:continueUserActivity:restorationHandler:. Si vous avez le projet original, essayez de rechercher cette méthode.

Veuillez noter que si l'application utilise openURL:options:completionHandler: pour ouvrir un lien universel vers le site web de l'application, le lien ne s'ouvrira pas dans l'application. Comme l'appel provient de l'application, il ne sera pas traité comme un lien universel.

  • Le schéma de l'URL webpageURL doit être HTTP ou HTTPS (tout autre schéma devrait lever une exception). La propriété d'instance scheme de URLComponents / NSURLComponents peut être utilisée pour vérifier cela.

Vérification de la méthode de gestion des données

Lorsque iOS ouvre une application à la suite d'un lien universel, l'application reçoit un objet NSUserActivity avec une valeur activityType de NSUserActivityTypeBrowsingWeb. La propriété webpageURL de l'objet d'activité contient l'URL HTTP ou HTTPS que l'utilisateur accède. L'exemple suivant en Swift vérifie exactement cela avant d'ouvrir l'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
}

En outre, n'oubliez pas que si l'URL comprend des paramètres, ils ne doivent pas être considérés comme fiables avant d'être soigneusement assainis et validés (même lorsqu'ils proviennent d'un domaine de confiance). Par exemple, ils pourraient avoir été falsifiés par un attaquant ou pourraient inclure des données malformées. Si c'est le cas, l'URL entière et donc la demande de lien universel doivent être rejetées.

L'API NSURLComponents peut être utilisée pour analyser et manipuler les composants de l'URL. Cela peut également faire partie de la méthode application:continueUserActivity:restorationHandler: elle-même ou peut se produire dans une méthode séparée appelée à partir de celle-ci. L'exemple suivant illustre ceci :

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
}
}

Références

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

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :