hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md
2023-06-03 13:10:46 +00:00

9.9 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 ils ne peuvent pas être revendiqués par d'autres applications car ils utilisent des liens HTTP(S) standard 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 en 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 testeur de pénétration, ce fichier est très intéressant car il dévoile les chemins. Il peut même révéler des chemins de versions qui n'ont pas encore été publiées.

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

Dans Xcode, allez à l'onglet Capabilities et recherchez Associated Domains. Vous pouvez également inspecter le fichier .entitlements en recherchant com.apple.developer.associated-domains. Chacun des domaines doit être préfixé par applinks:, comme applinks:www.mywebsite.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 peuvent être trouvées dans la Documentation archivée des développeurs Apple.

Si vous n'avez que l'application compilée, vous pouvez extraire les entitlements 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 à partir de l'étape précédente. Ce fichier doit être accessible via HTTPS, sans 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

Afin de recevoir des liens et de 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 géré comme un lien universel.

  • Le schéma de webpageURL doit être HTTP ou HTTPS (tout autre schéma doit générer 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 de données

Lorsque iOS ouvre une application en tant que résultat 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
}

De plus, n'oubliez pas que si l'URL contient des paramètres, ils ne doivent pas être considérés comme fiables avant d'être soigneusement nettoyés et validés (même s'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 tel est le cas, l'ensemble de l'URL et donc la demande de lien universel doivent être rejetés.

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 être appelé à partir d'une méthode distincte. L'exemple suivant démontre cela: example.

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥