Comment prendre un taxi aux frais de quelqu'un d'autre - vulnérabilités sur l'exemple d'un service

AprÚs avoir trouvé des vulnérabilités dans les services bancaires mobiles d'une banque ukrainienne ( poste ), j'ai voulu changer un peu de direction et passer des services financiers à d'autres.

Un article publicitaire sur l'application de taxi mobile mise à jour a attiré mon attention et je l'ai choisie comme expérimentale.

Ici, les outils sont les mĂȘmes: PC, Fiddler, Android-smartphone - installez l'application et suivez ses demandes.

En particulier, je n'ai pas pris en compte les demandes et les réponses lors de l'inscription ou de la connexion (par exemple, je n'ai pas vérifié la possibilité d'un mot de passe par force brute), mais je suis passé aux fonctions disponibles aprÚs l'inscription.

Étant donnĂ© que je n'avais pas d'historique de voyage avec ce service et que je ne voulais pas effectuer un vĂ©ritable voyage pour les tests, j'avais besoin de donnĂ©es de l'un des autres clients. J'ai dĂ©cidĂ© de demander Ă  des amis un compte dans le service. Parmi les connaissances, il y avait des clients de ce taxi, mais ils l'ont appelĂ© Ă  l'ancienne - Ă  l'aide d'un appel.

Ensuite, j'ai commencĂ© Ă  chercher des numĂ©ros de tĂ©lĂ©phone parmi les informations accessibles au public sur Internet - par exemple, sur le site officiel et parmi les avis sur les rĂ©seaux sociaux (les clients souvent insatisfaits, dĂ©crivant les plaintes, les laissent dans les commentaires pour consultation publique au lieu d'envoyer l'entreprise Ă  leur PM personnel ). En consĂ©quence, j'ai trouvĂ© quelques tĂ©lĂ©phones sur l'un des sites de recherche d'emploi. J'ai substituĂ© l'un d'eux dans les demandes suivantes et j'ai reçu des informations qui n'auraient pas dĂ» ĂȘtre accessibles Ă  quiconque de l'extĂ©rieur.



Ce sont les problĂšmes suivants:

1. Nous obtenons l'identifiant du client, son nom, son téléphone, son e-mail et sa ville (le taxi fonctionne dans plusieurs villes).

Lorsque l'application charge le profil, la demande POST suivante est exécutée:

https://sometaxi/mobile3/templateAll.php?PHPSESSID=4cmdlokh4luo209d88kv6uh7 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: User Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 37 func=loadMyInfo&phone=%2B380671234567 

En remplaçant le numéro de téléphone de quelqu'un d'autre dans la fonction loadMyInfo&phone , en réponse, j'ai reçu l'ID du client, son nom complet, son téléphone, son e-mail et sa ville:

 [{"id":14014,"varFirstName":" ","varLastName":"","varSurName":" ","varTel":"+380671234567","varTel2":"","varEmail":"Sergey_ivan@some.mail","city":1,"cityName":""}] 


2) Informations sur les cartes de paiement des clients

Dans la deuxiÚme demande, j'ai pu obtenir des informations sur les cartes de paiement ajoutées par le client à mon compte personnel:

 https://sometaxi/mobile3/ClientCard.php?PHPSESSID=4cmdlokh4luo209d88kv6uh7 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: User Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 58 data={"Task":"GetClientCardsData","phone":"+380671234567"} 

La réponse est:

 {"data":[{"masked_card":"512345XXXXXX6789","rectoken":"ccaffe873a0e88caf49bc65bbef2390329","card_type":"MASTERCARD","default":true,"card_name":""}]} 

Ici étaient disponibles: un numéro de carte tronqué, une sorte de jeton, le type de carte, si la carte est installée par défaut et son nom.

3) Obtenir des informations sur les voyages du client

La troisiÚme demande - loadHistory - m'a probablement fourni la quantité d'informations la plus importante et la plus importante (comme je le pensais alors):

 https://sometaxi/mobile3/templateAll.php?PHPSESSID=4cmdlokh4luo209d88kv6uh7 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: User Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 38 func=loadHistory&phone=%2B380671234567 

Une partie de la réponse (comme précédemment, les données ont changé) :

 {"id":454875,"From":"- ., 1","To":"і ., 13","When":"10-01-2019 15:55","WhenDate":1569942900,"Price":"160","Rate":0,"preorder":0,"status":1,"orderid":"11174445","additionalServices":"[]","classAvto":2,"callsignid":6426,"Car":"  ,Toyota Corolla,, 3733 ","city":1,"cityName":"ї","distance":"0.00"} {"id":408880,"From":"  ., 2","To":"- ., 1","When":"25-12-2018 03:44","WhenDate":1545709440,"Price":"79","Rate":0,"preorder":0,"status":1,"orderid":"10966503","additionalServices":"[]","classAvto":2,"callsignid":4545,"Car":"  ,Toyota Corolla,, 0415 ","city":null,"cityName":null,"distance":"0.00"} 

Voici les informations disponibles: adresse de départ, adresse de destination, date et heure du voyage, coût, ainsi que nom complet du chauffeur de taxi, type, couleur et numéro de sa voiture.

Total: avec quelques demandes, par numéro de téléphone, vous pouvez tout savoir sur le client de ce service, y compris certains détails de sa vie personnelle (par exemple, un voyage pour le Nouvel An à 2 heures du matin d'une adresse à une autre).

Il y avait sĂ»rement d'autres endroits dans la demande oĂč d'autres informations pouvaient ĂȘtre obtenues. Mais il a dĂ©jĂ  Ă©tĂ© trouvĂ© suffisamment pour informer les dĂ©veloppeurs Ă  ce sujet, ce que j'ai fait immĂ©diatement pour diriger les adresses de travail.

Nous avons correspondu pendant un mois et plus tard, ils m'ont payé des frais.



Et puis ce message pourrait se terminer, mais j'ai décidé de vérifier à nouveau si toutes les erreurs ont été corrigées.

Oui, deux des trois demandes ne me donnaient plus les informations des autres, mais une était toujours valide.

Les cartes de paiement sont ajoutĂ©es Ă  cette application de la mĂȘme maniĂšre que les autres: tout d'abord, sur une page spĂ©ciale, le client indique le numĂ©ro complet, la date d'expiration et les cartes CVV. Vient ensuite la vĂ©rification en radiant 1 UAH. et confirmation par le client d'une telle opĂ©ration Ă  l'aide de 3-D Secure / LookUp. C'est une pratique normale, le numĂ©ro complet et les autres dĂ©tails de paiement des cartes client ne figuraient pas dans les demandes.

Mais depuis que j'ai vu que ma carte ajoutée est supprimée par une demande du formulaire data={"Task":"DeleteClientCardsData", "rectoken":"bc65bbef2390329ccaffe873a0e88caf49" } , j'ai décidé de vérifier: que se passera-t-il si je spécifie le rectoken d'un autre client.

4) Retirer la carte de quelqu'un d'autre par jeton

J'exécute la demande avec un autre jeton:

 https://sometaxi/mobile3/ClientCard.php?PHPSESSID=5n4tim74asve7uefdf3hvd6c3 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G925F) Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 86 data={"Task":"DeleteClientCardsData","rectoken":"ccaffe873a0e88caf49bc65bbef2390329"} 

Et la carte extraterrestre a disparu!

J'ai Ă©galement vĂ©rifiĂ© cela avec la mĂȘme requĂȘte # 2 - Ă©tait-ce juste une rĂ©ponse visuelle {"status":"Success"."err":""} , ou la carte a-t-elle Ă©tĂ© vraiment supprimĂ©e du client.

La carte a en effet été supprimée.

ImmĂ©diatement, j'ai Ă©crit une deuxiĂšme lettre, m'excusant, mais j'ai dĂ©cidĂ© d'expĂ©rimenter davantage en me crĂ©ant un autre compte: si la carte peut ĂȘtre supprimĂ©e par le jeton - peut-ĂȘtre peut-elle ĂȘtre liĂ©e par le mĂȘme jeton, et elle peut ĂȘtre liĂ©e Ă  elle-mĂȘme?

5) Ajouter la carte de quelqu'un d'autre par jeton Ă  votre compte

Oui, je ne languirai pas - la carte de quelqu'un d'autre pourrait ĂȘtre liĂ©e Ă  elle-mĂȘme. L'essentiel est de connaĂźtre rectoken (et vous pouvez l'obtenir grĂące au problĂšme ouvert # 2).

Dans la demande POST, il était possible de spécifier toutes les données - les 6 premiers et les 4 derniers chiffres du numéro de carte, au moins 500000 **** 1111 - la carte était visuellement associée à ces données, et le jeton provenait d'un autre client et était valide.

 POST https://sometaxi/mobile3/ClientCard.php?PHPSESSID=5n4tim74asve7uefdf3hvd6c3 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G925F) Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 221 data={"Task":"ClientCardData","default":false,"phone":"+380991234567","masked_card":"500000XXXXXX1111","card_name":"Test","card_type":"MASTERCARD","rectoken":"4f6d228517f2d45690670aba78013a0408"} 

Qu'est-ce que cela signifie: en raison de la possibilité de lier le jeton à mon compte, je pourrais faire un voyage aux frais de quelqu'un d'autre sans connaßtre tous les détails de la carte et sans aucune vérification supplémentaire - aprÚs tout, la carte a déjà été ajoutée par le client et a été vérifiée avec succÚs par le service de paiement.

Explication de la possibilité de payer avec la carte de quelqu'un d'autre:
Pour simplifier la saisie des détails de paiement pour les paiements, un paiement en un clic basé sur des jetons est utilisé. Lors du premier achat, le client saisit les données de paiement, avec les paiements ultérieurs au client, il suffit de cliquer sur le bouton "payer".

Un jeton est un numĂ©ro unique attribuĂ© Ă  un ensemble de paramĂštres de carte dans le systĂšme. Ce jeton peut ĂȘtre utilisĂ© pour le paiement direct sans entrer CVV et sans authentification 3-D Secure.

En option
La création d'un jeton est un processus de paiement / blocage des fonds sur la carte d'un client réussi avec la saisie de tous les détails du client (numéro de carte, date d'expiration, CVV). Vous pouvez créer un jeton comme suit:

  1. Accepter le paiement (achat) - paiement réussi par le client avec l'introduction de tous les détails de la carte. La carte se voit attribuer un recToken et transmise dans la réponse.
  2. VĂ©rification de la carte / rĂ©ception d'un jeton (VĂ©rifier) ​​- vĂ©rification rĂ©ussie de la carte, blocage des fonds sur la carte du client. La carte se voit attribuer un recToken et transmise dans la rĂ©ponse.


Radiation par token - opération de débit / blocage de fonds sur la carte, sans la participation du client, en transférant le token du commerçant.

Un exemple d'explication est tiré d'ici .

Les dĂ©veloppeurs ont demandĂ© de dĂ©montrer la possibilitĂ© de transfĂ©rer le jeton de leur compte vers le mien et de commander un taxi - ils devaient s'assurer que la dĂ©duction du jeton se produirait vraiment. Bien sĂ»r, la commande a Ă©tĂ© passĂ©e, l’argent a Ă©tĂ© dĂ©bitĂ© ( je ne suis pas montĂ© dans la voiture ). Plus tard, ils m'ont payĂ© un peu plus d'argent.



Comme vous pouvez le voir dans cet article et dans les articles précédents, parfois PHPSESSID, Authorization ou SecurityToken ne suffit pas.

Si vous ĂȘtes dĂ©veloppeur, veuillez suivre ce que vous donnez lorsque vous le demandez. Si vous ĂȘtes un testeur, recherchez et trouvez, mais assurez-vous d'en informer les dĂ©veloppeurs. Les vulnĂ©rabilitĂ©s sont pleines ici et lĂ , alors soyez un hacker blanc.

Source: https://habr.com/ru/post/fr443928/


All Articles