Beim Durchführen von Penetrationstests erlebt man immer wieder Überraschungen und findet Fehler, die man sich in seinen kühnsten Träumen nicht vorstellen kann. So auch bei einem eigentlich ganz normalen Penetrationstest für einen Kunden.
Zu testen war eine digitale Plattform, die einen Produktpreis sowie einen Rabattfaktor mit vertretungsberechtigten Personen verknüpft, sodass diese Personen dann mit den verknüpften Daten ein Geschäft abschließen können. Dem Auftragnehmer wird durch die verifizierte Identität des Käufers die Möglichkeit geboten, seine Zahlungsbedingungen mittels des Rabattfaktors anzupassen.
Wir starteten also mit dem Test und verschafften uns zunächst einen Überblick über offene Ports und eventuell auffindbare Verzeichnisse, aber hier war alles in Ordnung. Anschließend versuchten wir, über eigentlich nicht zulässige HTTP-Methoden auf URLs eigene Daten ins System zu bringen, auch das schlug fehl.
Also nahmen wir die Aufrufe beim Verifizieren der Daten gegenüber dem Shopbetreiber genauer unter die Lupe. Der prinzipielle Ablauf gestaltet sich folgendermaßen:
Der Shop meldet den Preis und alle weiteren Daten zum Kauf an die Kunden-API, diese übernimmt dann die Verifizierung.
Die Einbindung der Kunden-API erfolgt über ein Javascript-SDK. Dort wird ein Objekt erzeugt, welches einen Eventhandler für den Abschluss des Vorgangs im “Kunden UI” besitzt, sodass die API den Shopbetreiber benachrichtigt, wenn die Informationen freigegeben werden oder nicht.
Um die Anwendung sicher zu machen, setzt das Entwicklungsteam auf JWT, sodass die Daten jeder Anfrage signiert werden können.
Das sah konkret dann so aus:
Man sieht, dass ein JWT mitgesendet wird, welches dieselben Daten aus den Parametern price und discount in signierter Form enthält. Dementsprechend beschränkt waren die Angriffsmöglichkeiten, da die JWT selbst korrekt implementiert waren. Uns fielen sofort die Variablen price und discount ins Auge, sodass wir diese Anfrage mit unserem HTTP-Proxy unterbrochen und manipuliert haben, mit erschreckendem Ergebnis: der Server akzeptierte die Anfrage und wir erhielten als Antwort ein JSON-Objekt mit dem Status “VALID”. So könnte ein Kunde die Preise der Produkte, die er bestellen möchte, zu seinen Gunsten manipulieren.
Das Entwicklungsteam reagierte entsetzt auf den Befund, man setzt doch bereits diverse Security-Tools ein. Eine Nachprüfung durch das Entwicklerteam bestätigte schlussendlich, dass durch diese Lücke ein Angreifer seinen Preis und seinen Rabatt manipulieren könnte.
Dieses Beispiel zeigt sehr gut, warum regelmäßige Pentests wichtig sind, denn ohne Pentest wäre diese Sicherheitslücke mit hoher Wahrscheinlichkeit in Produktion geraten.