Hallo liebe Leser,

heute möchte ich euch etwas zum Thema Cross Site Scripting beibringen und später anhand eines Praxisbeispiels demonstrieren wie so etwas abläuft. Passenderweise habe ich vor ca. einer Woche eine Reflected Cross Site Scripting (oder auch kurz XSS) Lücke bei heise.de entdeckt und darf diese mit Erlaubnis auf meinem Blog vorstellen.

Aber zuerst sollten wir uns fragen, was ist eigentlich Cross Site Scripting?

Als Cross Site Scripting, oder eben als XSS Lücke, bezeichnet man Sicherheitslücken in zum Beispiel Webanwendungen, die Usereingaben in einem (zum Beispiel) Formular nicht richtig filtern. Die übergebenen Daten werden ungefiltert und damit unsicher wieder dargestellt und bei korrekter Anwendung eines Schadcodes kann dort zum Beispiel HTML, JavaScript oder sonstiges ausgeführt werden.

Grundsätzlich unterscheidet man zwischen 3 Arten von Cross Site Scripting. Reflected, persistent und DOM Based. In diesem Artikel stelle ich euch jetzt eine echte Reflected XSS vor. Diese Lücke tritt nur auf, wenn in einem HTTP Request Schadcode ungefiltert dargestellt wird. Also wenn der Übergabeparameter text normalerweise nur euren übermittelten Text übergibt, ihr dort aber einen HTML Code ausgeben lasst und diesen Parameter dementsprechend abändert, wird der Code implementiert und auch dementsprechend ausgeben.

Aus der URL sichereseite.de/schadcode.php?text=SichererText wird sichereseite.de/schadcode.php?text=<h1>XSS</h1>! Und schon wird auf unserer Seite eine Überschrift mit dem Text „XSS“ dargstellt, die unser Webseitenbetreiber selber nicht dort haben wollte. Kommen wir nun zur Praxis.

Praxisbeispiel auf heise.de

Ich bin fleißiger Leser des Heise.de Redaktionsteams und habe einfach mal aus Spaß ein bisschen rumgewerkelt, als ich das Heise Plus Abonnement abgeschlossen habe und hatte dort bereits nach ca. 10 Minuten Erfolg. Mir gelang es über einen ungesicherten Parameter (plenigo-affiliate-id) HTML, sowie JavaScript einzuschleusen und diesen auch ausgeben zu lassen.
xss - header & paragraph

Ich habe auf der linken Seite nun 3 anschauliche Bilder für euch um zu demonstrieren, was zum Beispiel alles möglich ist. Dies ist allerdings nur eine kleine Auswahl, sollte euch aber einen guten Einblick geben.

Als erstes habe ich eine simple Überschrift und einen Beispieltext ausgeführt, was zu den Grundsätzen gehört, mit denen ich zuerst gucke ob ein Parameter oder die Eingabe generell überhaupt gefiltert wird.

xss - cookie output

In meinem 2. Beispiel bin ich etwas weitergegangen, da ich Probleme hatte normales Javascript auszuführen. Also habe ich mich erweitert und einen falschen Link dargestellt. Dieser Link hat eine absichtlich falsche Syntax. Mit dem JavaScript Event „onmouseover“ habe ich dann eine einfache Implementierung von JavaScript erreicht, was mir mit dem normalen <script> Tag nicht gelungen ist. Also hier sieht man, es gibt immer Mittel und Wege, man muss diese nur finden. In diesem Praxisbeispiel habe ich einfach alle Cookies ausgegeben, welche auf meinem Computer zu finden waren. Beispielcode:

"><a onmouseover="alert(document.cookie)">xxs link</a>
xss - javascript alert
In meinem letzten Beispiel habe ich das JavaScript Event „onerror“ getriggert. Ich habe mit Absicht ein Bild falsch eingebunden, sodass ein Error entstand und da ich vorher ja ein Event definiert hatte und gesagt hatte was dann passieren sollte, konnte ich auch hier einfach die Ausgabe erzwingen. Allerdings hatte ich dieses Mal den Code nicht lesbar definiert, sondern als Zeichencode (CharCode) Beispielcode:
"><IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

Dieser Code wurde übersetzt und mittels alert Meldung als Fenster im Browser ausgegeben.

Diese Lücke habe ich direkt an Heise.de weitergeleitet, welche am nächsten Tag bereits einen Hotfix eingespielt hatten. Auch die Möglichkeiten für „Bad Guys“ waren sehr begrenzt, sodass sich auch niemand groß Sorgen machen musste. Trotzdem ist es wichtig auf solche Lücken hinzuweisen. Ich bedanke mich für deine Aufmerksamkeit und wünsche noch einen angenehmen Tag. Beim nächsten Mal zeige ich dir wie man solche Lücken verhindert und korrekt filtert und prüft. Danke, Maurice :)!