Thumbnail

Hallo und willkommen zurück zu einem neuen Blogpost! Heute geht es um eine reflected XSS auf der Lotteriewebsite tipp24.com. Im Vorwort möchte ich noch anmerken, dass der Support und die Entwickler der Website sehr professionell und schnell reagiert haben. Das habe ich selten so von größeren Firmen gesehen. Teilweise muss man Wochen auf Antworten oder einen Fix warten.

Was ist tipp24.com?

Tipp24 sagt über sich selber: “Sie können bei uns nicht nur verschiedene Lotterien spielen, sondern auch an unterschiedlichen Spielgemeinschaften teilnehmen. Tipp24 hat aktuell über 3 Millionen zufriedene Kunden und bisher mehr als 1,8 Milliarden Euro ausgezahlt. Ihre Tipps sind bei uns sicher, denn Tipp24 ist offizieller Partner von LOTTO und wir geben Ihre Spielscheine direkt bei den staatlichen Lotterien in Deutschland ab.“. Dementsprechend kann man sich vorstellen, dass Tipp24 einer der größten Anbieter im deutschsprachigen Raum ist.

Die Lücke

Ich bin tatsächlich durch Zufall auf die Lücke gestoßen. Ich wollte mich vom Newsletter der Website abmelden und habe bemerkt, dass in der URL sehr viele Parameter angezeigt wurden. So etwas ergibt zum Beispiel bei einer Suchfunktion Sinn, da man sich eine bestimmte Suche dann einfach als Lesezeichen im Browser speichern kann. Warum das ganze bei der Abmeldung eines Newsletters vonnöten ist? Das kann ich mir nicht erklären, allerdings hat dies bestimmt eine Funktion, die ich einfach nicht nachvollziehen kann.

Der Link dazu ist folgender: https://www.tipp24.com/abbestellen?type={UNSICHER}&authId=&advertisementId=&wt_mc=&wt_cc1=&wt_cc2=&wt_cc3=&partnerId=&M_BT=

Den damals unsicheren Parameter habe ich mit {UNSICHER} markiert. Mir ist relativ schnell aufgefallen, dass ein “Bad Guy” relativ wenig mit dieser Lücke hätte anstellen können, da eine WAF installiert ist und dort gute Dienste leistet. Allerdings war es mir trotzdem möglich simplen HTML Code auszuführen, was im klassischen Sinne eine XSS darstellt. Meiner Meinung nach, hätte man mit dieser Lücke mehr Imageschaden verursachen können, als wirklichen Schaden beim Nutzer der Website.

Im Prinzip wurde im Parameter “type” der Name des Newsletters gespeichert und auf der Website ausgegeben. Hätte ich dem Parameter den Wert “FauleSocke” gegeben, würde auf der Website der Text “Leider konnten wir sie nicht von unserer Verteilerliste FauleSocke […]” stehen. Mehr dazu weiter unten im Text.
reflected xss (url)

reflected xss (website) Wie man erkennen kann, habe ich in der URL anstatt dem Namen des Newsletters mehrere HTML Tags gegeben. Unter anderem Zeilenumbrüche und verschiedene Überschriften, sodass man das auf der Website gut erkennen kann.

Wie kann man das fixen?

Ich habe in meinem Report direkt auch beschrieben, wie man die Lücke schließen könnte. Die schnellste und einfachste Lösung wäre die Parameter mit htmlspecialchars() zu entschärfen. Ich kann mir vorstellen, dass der Parameter in einer Variable (nenne ich jetzt einfach “verteilerliste”) gespeichert wird und das der Quellcode der Website so lautet.

<p>Leider konnten wir Sie nicht aus unserer Verteilerliste <?php echo $verteilerliste; ?> austragen.</p>

Wenn wir jetzt htmlspecialchars() anwenden, sieht das ganze so aus.

<p>Leider konnten wir Sie nicht aus unserer Verteilerliste <?php echo htmlspecialchars($verteilerliste); ?> austragen.</p>

Das wäre die einfachste und etwas unschönere Variante. Es wird zwar kein HTML Code mehr implementiert, aber trotzdem wird dieser als Name der Verteilerliste ausgegeben, was natürlich etwas unschön ist. Die ITler hinter Tipp24 haben die Lücke genauso gefixed, wie ich Ihnen das vorgeschlagen hatte und das auch selber gemacht hätte. Allerdings bin ich mir sicher, dass die ITler da auch selber drauf gekommen wären.

Ich gehe einfach davon aus, dass die Verteilerlisten in einer der unzähligen Datenbanken gespeichert sind. Kurze Erklärung, warum ich von mehreren Datenbanken ausgehe? Ich gehe davon aus, weil es sehr sehr sehr verwerflich wäre, private Kundendaten, Kreditkarten Nummern, Handy Nummern, Adressen mit sowas banalem zu mischen. Das wird mit Sicherheit alles getrennt gespeichert.

Ich gehe also davon aus, dass die Verteilerlisten in einer Datenbank gespeichert sind. Ich würde nun also eine Abfrage starten, ob die Verteilerliste mit dem Namen aus der Variable “verteilerliste” in der Datenbank vorhanden ist. Das kann man gefahrlos mit Prepared Statements machen. PS: Dazu habe ich bereits einen Blogpost veröffentlicht. Das verbinde ich mit einer IF/ELSE Ausführung. Wenn die Verteilerliste vorhanden ist, kann ich den Inhalt der Variable ohne Probleme auf der Website ausgeben. Sollte die Verteilerliste nicht vorhanden sein, gebe ich einen Standardtext aus. Das könnte zum Beispiel “Leider konnten wir Sie nicht von unserem Newsletter abmelden.” sein.

Die Belohnung

Wie bereits gesagt, der Support und die ITler waren sehr schnell im Antworten und dem Schließen dieser Lücke. Neben einem Dankeschön per E-Mail gab es für mich noch einen Bonus. Dieser besteht aus einem Spielguthaben von 20,00 EUR auf der Website. Das reicht mit Sicherheit für mehrere Lottoziehungen mit der Familie :).

Ich danke für eure Aufmerksamkeit und wünsche euch noch einen schönen Tag! Maurice

Hallo! Ich bin Maurice. Ich komme aus dem wunderschönen Magdeburg und wenn ich nicht gerade in CS:GO verzweifle, vertreibe ich mir meine Zeit mit meinem Blog und Web Design/Web Development.

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.