Obwohl ich inzwischen meine Bahnfahrten überwiegend über die Android-App plane, habe ich letztens mal wieder einen Blick auf https://reiseauskunft.bahn.de/ geworfen. Dort kann man im Grunde das gleiche tun, wie in der App. Zusätzliche bietet die Webseite jedoch noch eine XSS-Lücke 🙂
Laaaaange URLs
Ein Großteil der Informationen werden über URL-Parameter übergeben. Eine Fahrtenauskunft zwischen Dortmund und Bochum sieht dann z.B. so aus:
reiseauskunft.bahn.de/bin/query.exe/dn?ld=3750&protocol=https:&seqnr=2&ident=f6.0858550.1595424986&rt=1&rememberSortType=minDeparture&newVerbundtarif=1&oCID=C1-1&conId=C1-1&verbundpreis=yes&verbund=VRR&showAvailVerbund=yes&
Einfach durchprobieren
Beim Parameter conId
bin ich schlussendlich fündig geworden. Der Parameter wird in Form einer JavaScript-Variable reflektiert.
&conId=test123456
Warum die Variable “bla” heißt und wofür diese überhaupt gebraucht wird, konnte ich nicht herausfinden. Vermutlich hat hier ein Azubi mal “kurz was versucht”. Fakt war jedoch, dass durch das Einsetzen eines Anführungszeichen, der String geschlossen werden konnte.
Payload basteln
Zunächst wäre ein alert
ausreichend. Es stellte sich aber schnell heraus dass man mit der Payload " + alert(0) + "
nicht viel erreichen konnte, da es in dem JavaScript-Block bereits zuvor zu einer Exception kommt, was die Ausführung der Payload verhindert.
Noch ein bissl HTML
Bei Exceptions im JavaScript-Code aufgrund von Syntaxfehlern wird die Ausführung des nachfolgenden Codes oftmals unterbrochen. Dies gilt aber nur für den Code im selben JavaScript-Block. Hiermit ist der Inhalt des selben <script>
-Tags gemeint.
Daraus ergibt sich die Möglichkeit, den Script-Tag zu schließen und einen neuen zu öffnen.
Payload: "</script><script>alert(0)</script>
Eine etwas andere Report-Strategie
Anstelle das Unternehmen per Mail auf die Lücke aufmerksam zu machen, setzte ich einen öffentlichen Tweet über die Lücke ab. Zum einen habe ich keine Security-Kontaktadresse gefunden, zum anderen gab es ein wenig Frustration aufgrund aktueller Geschehnisse bei der Bahn (man kann sich denken was war 🙂
Eine Antwort vom Twitter-Account der Bahn ließ nicht lange auf sich warten. Zwar konnte der Social-Media-Betreuer nicht viel mit dem “Report” anfangen, was ich aber dann recht schnell per DM klären konnte. Details zur Lücke wollte der Social-Media-Mensch an die dafür zuständige Abteilung weiterleiten. Das war am 17. Januar 2020.
Die Zeit verging und nichts passierte, bis ich am 26. Mai 2020 eine weitere DM vom Bahn-Account erhielt. Darin wurde ich gebeten, Details zur Lücke an eine Mail-Adresse der Bahn zu senden. Gesagt getan. Zwar lagen alle relevanten Infos bereits in der Konversation vor, welche man auch einfach hätte weiterleiten können, aber man hilft doch gerne.
Positive Überraschung
Die XSS-Lücke wurde in darauf folgenden Tagen geschlossen.
Fazit
Kommunikationswege außerhalb der Öffentlichkeit sind in den meisten Fällen vorteilhaft. Das es trotz der zunächst öffentlichen Kommunikation dennoch ein “Bounty” gab, hat mich sehr überrascht.