Voler l'identité de l'utilisateur (PII) en appelant directement une API

Aujourd'hui, nous avons décidé de discuter du thème de la sécurité de l'information. Nous publions la traduction de l'article de Kunal pandey, détectons les vulnérabilités et travaillons avant la courbe!


introduction



Le vol de données personnelles (PII) de l'utilisateur est devenu courant pour nous. Les attaquants trouvent de nombreuses façons d'obtenir des données personnelles, par exemple en utilisant les vulnérabilités XSS et IDOR, la divulgation des points de terminaison d'API, etc.



Le scénario décrit dans cet article peut être testé en observant simplement le comportement du point de terminaison de l'API. Dans l'exemple ci-dessous, en appelant l'API, les informations personnelles de tout utilisateur peuvent être stockées dans d'autres points de terminaison d'API.



Explication



Dans l'un des programmes privés de la plateforme HackerOne Bug Bounty , où j'ai été invité, il a été proposé de tester le portail du magasin, à savoir la section consacrée au travail du vendeur. Ici, les employés du magasin peuvent envoyer à n'importe quel client une invitation «Passer une commande». Pour obtenir les informations dont ils ont besoin, le vendeur envoie cette demande aux clients par e-mail ou à l'aide d'un code QR.







Après avoir reçu un lien avec une invitation à effectuer un paiement, l'acheteur se rend sur: payment-na.examle.com/0811ebf4-d7d0-ba31-9ce68648a5a9 et remplit les données requises.







Lorsqu'une requête est interceptée, Burp Suite découvre un point de terminaison d'API POST qui contient les données saisies.



Demande



POST /na/customer/client/v1/session/002420e4-e031-47aa-8d94-6f7c40c248c7 HTTP/1.1

Host: payments-na.example.com

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Firefox/78.0

Accept: application/json, text/plain, */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: application/json;charset=utf-8

X-Cdc-Client: 2.15.45

Content-Length: 125

Origin: https://payments-na.example.com

DNT: 1

Connection: close

Referer: https://payments-na.example.com



{"browser_prefilled":[],"customer_details":{"country":"US"..............},"skipped_fields":[],"user_submitted":true,"action":"continueAddressUnverified"}




Répondre







Après avoir rempli le formulaire, l'opération est terminée. Terminé!







Lors de la méthode POST à payments-na.example.com/na/customer/client/v1/session/002420e4-e031-47aa-8d94-6f7c40c248c7 toutes les informations sont enregistrées, le paiement a été effectué.



Étape d'opération



Les utilisateurs ou les attaquants peuvent trouver une autre section du portail où ils peuvent utiliser la fonction Passer commande, tout comme dans la méthode décrite ci-dessus, et recevoir le lien de paiement suivant: payment-na.examle.com/fa5daba4-5d50-8f80 –9eb1-ebia3ea6d665 .







Dans ce cas, remplissez simplement le formulaire, interceptez la demande dans Burp Suite, recevez une demande POST à payment-na.example.com/na/customer/client/v1/session/xxxx , chargez le point de terminaison API généré et rejetez les autres demandes à nous ne les avons pas envoyés.



Point de terminaison d'API reçu: payment-na.example.com/na/customer/client/v1/session/96afd42f-4281-4529-9b8c-3ba70b0f000b .



Pour des tests supplémentaires, ce point de terminaison peut également être utilisé à l'aide de la méthode GET dans le navigateur. Vous trouverez ci-dessous une capture d'écran du point de terminaison API résultant:







Comme nous pouvons le voir, aucune information n'a encore été ajoutée et aucun paramètre n'a été spécifié.



Nous allons maintenant récupérer ce lien API et l'envoyer aux autres utilisateurs qui ont rempli les détails de leur commande. Dès que la victime clique sur ce lien API, toutes les données personnelles de la soumission précédente qui ont été stockées ici ( / na / customer / client / v1 / session / 002420e4-e031-47aa-8d94-6f7c40c248c7 ) seront copiées vers le point de terminaison spécifié API: / na / client / client / v1 / session / 96afd42f-4281-4529-9b8c-3ba70b0f000b .



Une fois que la victime a cliqué sur le lien API que nous vous avons envoyé, toutes les données personnelles de l'utilisateur seront copiées sur ce point de terminaison.



Du côté de la victime: il







suffit à un attaquant de visiter simplement ce point de terminaison de l'API en mode incognito, et les données de la victime seront copiées (email, adresse, etc.).



Données personnelles de la victime: De







cette façon, les attaquants pourraient obtenir les données personnelles de n'importe quel client simplement en créant un nouveau point de terminaison API de session et en l'envoyant à d'autres utilisateurs.



Travailler sur les bugs



L'équipe de développement du portail a supprimé la méthode GET, l'a liée à la méthode POST et a ajouté l'en-tête de jeton d'autorisation à la demande de méthode POST ci-dessus, où elle s'authentifiera à chaque fois depuis le serveur.



Cela a éliminé la possibilité de répéter le scénario décrit ci-dessus - une attaque avec copie des données personnelles de l'utilisateur via l'API.



Points clés



1. Les scénarios de telles attaques peuvent être différents, mon exemple n'en est qu'un. Faites attention à ces vulnérabilités et essayez de creuser plus profondément pour créer un scénario similaire: comment un attaquant pourrait-il vous attaquer autrement.



2. Dans l'exemple décrit, l'API de l'attaquant a été authentifiée auprès du point de terminaison d'API de la victime car il n'y a pas eu de validation de l'en-tête du jeton d'autorisation. Cela permettait au serveur de copier les données personnelles des clients vers un autre point de terminaison d'API.



Déroulement des événements:



22 juillet: j'ai signalé la vulnérabilité à l'équipe du portail.



23 juillet: Le rapport a été examiné par l'équipe et la gravité a été définie sur Moyenne.



23 juillet: Reçu une récompense de 500 $.



27 juillet: Problème résolu, rapport rédigé.



All Articles