So fahren Sie ein Taxi auf Kosten eines anderen - Schwachstellen am Beispiel eines Dienstes

Nachdem ich Schwachstellen im Mobile Banking einer ukrainischen Bank ( Post ) gefunden hatte, wollte ich die Richtung ein wenig ändern und von Finanzdienstleistungen zu anderen wechseln.

Ein Werbeartikel über die aktualisierte mobile Taxi-Anwendung fiel mir auf und ich wählte ihn als meine experimentelle.

Hier sind die Tools dieselben: PC, Fiddler, Android-Smartphone - installieren Sie die Anwendung und verfolgen Sie ihre Anforderungen.

Ich habe bei der Registrierung oder Anmeldung keine Anfragen und Antworten berücksichtigt (z. B. habe ich die Möglichkeit eines Brute-Force-Passworts nicht geprüft), sondern nach der Registrierung auf die verfügbaren Funktionen umgestellt.

Da ich in der Vergangenheit noch keine Reisen mit diesem Service unternommen habe und keine echte Reise zum Testen durchführen wollte, benötigte ich Daten von einem der anderen Kunden. Ich beschloss, Freunde nach einem Konto im Dienst zu fragen. Unter den Bekannten gab es Kunden dieses Taxis, aber sie riefen ihn auf altmodische Weise an - mit einem Anruf.

Dann suchte ich nach Telefonnummern unter Informationen, die im Internet öffentlich verfügbar sind - zum Beispiel auf der offiziellen Website und unter Bewertungen in sozialen Netzwerken ( oft unzufriedene Kunden, die Beschwerden beschreiben, sie in den Kommentaren zur öffentlichen Ansicht belassen, anstatt das Unternehmen an ihre persönliche PM zu senden ). Infolgedessen habe ich auf einer der Websites für die Jobsuche ein paar Telefone gefunden. Ich ersetzte einen von ihnen in nachfolgenden Anfragen und erhielt Informationen, die für niemanden von außerhalb zugänglich sein sollten.



Dies waren die folgenden Probleme:

1. Wir erhalten die Kunden-ID, seinen Namen, Telefon, E-Mail und Stadt (Taxi funktioniert in mehreren Städten).

Wenn die Anwendung das Profil lädt, wird die folgende POST-Anforderung ausgeführt:

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 

Durch Ersetzen der Telefonnummer eines anderen in der Funktion loadMyInfo&phone erhielt ich als Antwort die Kunden-ID, seinen vollständigen Namen, sein Telefon, seine E-Mail-Adresse und seine Stadt:

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


2) Informationen zu Kundenzahlungskarten

Bei der zweiten Anfrage konnte ich Informationen zu Zahlungskarten erhalten, die der Kunde meinem persönlichen Konto hinzugefügt hat:

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

Die Antwort lautet:

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

Hier waren verfügbar: eine abgeschnittene Kartennummer, eine Art Token, Kartentyp, ob die Karte standardmäßig installiert ist und ihr Name.

3) Informationen über die Reisen des Kunden erhalten

Die dritte Anfrage - loadHistory - lieferte mir erwartungsgemäß die größte und wichtigste (wie ich damals dachte) Menge an Informationen:

 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 

Teil der Antwort (wie zuvor, Daten geändert) :

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

Hier sind verfügbar: Abfahrtsadresse, Zieladresse, Datum und Uhrzeit der Reise, Kosten sowie vollständiger Name des Taxifahrers, Typ, Farbe und Nummer seines Autos.

Insgesamt: Mit zwei Anfragen können Sie anhand der Telefonnummer alles über den Kunden dieses Dienstes erfahren, einschließlich bestimmter Details seines persönlichen Lebens (z. B. eine Reise zum neuen Jahr um 2 Uhr morgens von einer Adresse zur anderen).

Sicherlich gab es andere Stellen im Antrag, an denen andere Informationen eingeholt werden konnten. Aber es wurde bereits genug gefunden, um die Entwickler darüber zu informieren, was ich sofort tat, um Arbeitsadressen zu leiten.

Wir korrespondierten einen Monat lang und später zahlten sie mir eine Gebühr.



Und dann könnte dieser Beitrag enden, aber ich habe mich entschlossen, noch einmal zu überprüfen, ob alle Fehler behoben wurden.

Ja, zwei der drei Anfragen gaben mir nicht mehr die Informationen anderer Leute, aber eine war noch gültig.

Zahlungskarten werden dieser Anwendung wie jeder anderen hinzugefügt: Zunächst gibt der Kunde auf einer speziellen Seite die vollständige Nummer, das Ablaufdatum und die CVV-Karten an. Dann erfolgt die Überprüfung durch Abschreiben von 1 UAH. und Kundenbestätigung eines solchen Vorgangs mit 3-D Secure / LookUp. Dies ist üblich, die vollständige Nummer und andere Zahlungsdetails der Kundenkarten waren nicht in den Anfragen enthalten.

Da ich jedoch sah, dass meine hinzugefügte Karte durch eine Anforderung des Formulars data={"Task":"DeleteClientCardsData", "rectoken":"bc65bbef2390329ccaffe873a0e88caf49" } , entschied ich mich zu überprüfen: Was passiert, wenn ich das Rectoken eines anderen Clients spezifiziere?

4) Entfernen der Karte eines anderen per Token

Ich führe die Anfrage mit einem anderen Token aus:

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

Und die Alienkarte ist weg!

Ich habe dies zusätzlich mit derselben Abfrage Nr. 2 überprüft - war es nur eine visuelle Antwort {"status":"Success"."err":""} oder wurde die Karte wirklich vom Client gelöscht?

Die Karte wurde tatsächlich gelöscht.

Sofort schrieb ich einen zweiten Brief, entschuldigte mich, beschloss aber, weiter zu experimentieren, indem ich ein anderes Konto für mich selbst erstellte: Wenn die Karte durch den Token gelöscht werden kann - kann sie möglicherweise durch denselben Token verknüpft und an sich selbst gebunden werden?

5) Hinzufügen der Karte einer anderen Person per Token zu Ihrem Konto

Ja, ich werde nicht schmachten - die Karte eines anderen könnte an sich selbst gebunden sein. Die Hauptsache ist, Rectoken zu kennen (und Sie können es dank des offenen Problems Nr. 2 bekommen).

In der POST-Anforderung konnten beliebige Daten angegeben werden - alle ersten 6 und letzten 4 Ziffern der Kartennummer, mindestens 500.000 **** 1111 - die Karte wurde diesen Daten visuell zugeordnet, und das Token stammte von einem anderen Client und war gültig.

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

Was bedeutet das: Aufgrund der Möglichkeit, den Token mit meinem Konto zu verknüpfen, könnte ich auf Kosten eines anderen eine Reise unternehmen, ohne die vollständigen Details der Karte zu kennen und ohne zusätzliche Überprüfung - schließlich wurde die Karte bereits vom Kunden hinzugefügt und vom Zahlungsdienst erfolgreich überprüft.

Erläuterung zur Möglichkeit, mit der Karte eines anderen zu bezahlen:
Um die Eingabe von Zahlungsdetails für Zahlungen zu vereinfachen, wird eine Ein-Klick-Zahlung basierend auf Token verwendet. Beim ersten Kauf gibt der Kunde die Zahlungsdaten ein. Bei nachfolgenden Zahlungen an den Kunden reicht es aus, auf die Schaltfläche "Bezahlen" zu klicken.

Ein Token ist eine eindeutige Nummer, die einem Satz von Kartenparametern im System zugewiesen wird. Dieses Token kann für die direkte Zahlung ohne Eingabe von CVV und ohne sichere 3-D-Authentifizierung verwendet werden.

Optional
Das Erstellen eines Tokens ist ein Prozess der erfolgreichen Zahlung / Sperrung von Geldern auf der Karte eines Kunden unter Eingabe der vollständigen Details des Kunden (Kartennummer, Ablaufdatum, CVV). Sie können ein Token wie folgt erstellen:

  1. Zahlung akzeptieren (Kauf) - erfolgreiche Zahlung durch den Kunden mit Einführung der vollständigen Kartendetails. Der Karte wird ein recToken zugewiesen und in der Antwort übertragen.
  2. Überprüfung der Karte / Erhalt eines Tokens (Verify) - erfolgreiche Überprüfung der Karte, Sperrung des Guthabens auf der Karte des Kunden. Der Karte wird ein recToken zugewiesen und in der Antwort übertragen.


Abschreibung per Token - Vorgang der Belastung / Sperrung von Geldern auf der Karte ohne Beteiligung des Kunden durch Überweisung des Tokens vom Händler.

Eine beispielhafte Erklärung wird von hier genommen .

Die Entwickler wollten die Möglichkeit demonstrieren, den Token von ihrem Konto auf meinen zu übertragen und ein Taxi zu bestellen - sie mussten sicherstellen, dass der Token-Abzug wirklich stattfinden würde. Natürlich wurde die Bestellung bestanden, das Geld wurde belastet ( ich bin nicht ins Auto gestiegen ). Später zahlten sie mir noch etwas Geld.



Wie Sie diesem und früheren Artikeln entnehmen können, reicht PHPSESSID, Authorization oder SecurityToken manchmal nicht aus.

Wenn Sie ein Entwickler sind, folgen Sie bitte dem, was Sie geben, wenn Sie fragen. Wenn Sie ein Tester sind, suchen und finden Sie, aber informieren Sie die Entwickler unbedingt darüber. Hier und da gibt es viele Sicherheitslücken. Seien Sie also bitte ein weißer Hacker.

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


All Articles