Cross-Site-Scripting: Datenklau über Bande

Nicht immer muss ein Buffer Overflow herhalten, um unerlaubt Befehle irgendwo einzuschleusen und auszuführen. Neue Angriffstechniken transportieren ausführbaren Code sogar in Hyperlinks.

Lesezeit: 7 Min.
In Pocket speichern
vorlesen Druckansicht
Von
  • Daniel Bachfeld
Inhaltsverzeichnis

Vier Dinge spielen im Schaustück Cross-Site-Scripting (XSS) die Hauptrollen: Ein Angreifer mit einem manipuliertem Hyperlink, eine Web-Applikation die dynamische Seiten ausliefert, ein Webclient mit aktiviertem JavaScript und ein Cookie mit Benutzerdaten. Im Mittelpunkt steht die Web-Applikation, die Seiten aus Benutzereingaben generiert, die an sie gesendet werden:

http://www.vertrauenswürdige.seite/cgi-bin
/test.cgi?irgendwas

Variablen in einer URL zu übertragen, ist durchaus üblich und wird in HTTP mit der GET-Methode unterstützt. Auf der Serverseite wird ein Skript gestartet, welches die Variable einliest, eine neue Seite generiert und an den Webbrowser sendet. Das obige Beispiel findet sich zum Beispiel in der Apache-Standardinstallation. Das Skript test.cgi gibt die Umgebungvariablen aus, die es in einem sogenannten Hash gespeichert hat:

print "%ENV:\n", map { "$_ = $ENV{$_}\n" } keys %ENV;

Darüberhinaus zeigt es auch den sogenannten Query-String hinter dem Fragezeichen an "irgendwas", Benutzereingaben werden also an den Browser zurückgesendet. Geschieht dies wie hier, völlig ungefiltert, so kann ein kleines JavaScript als Argument in der URL an den Server übertragen werden. Dieser verpackt es in ein HTML-Dokument und sendet es zurück. Das Echo kann verheerende Folgen haben, wenn der Code im Browser ausgeführt wird.

Beim Test-Skript des Apache wird niemand dem Programmierer einen Fehler vorwerfen. Bei Webshops, Webmailern und Portalen sieht die Sache etwas anders aus, hier sollten die Argumente sorgfältig gefiltert werden.

Folgendes Skript öffnet ein kleines Fenster mit dem Text "Überraschung" und einem OK-Button zum Schließen:

http://www.vertrauenswürdige.seite/cgi-bin
/test.cgi?<script>alert("Überraschung")</script>

Das Skript hätte natürlich auch in einem HTML-Dokument auf dem Server eingebettet sein können, wo ist also das Problem? Aus Sicherheitsgründen ist JavaScript oft nur für benutzerdefinierte, vertrauenswürdige Webserver zugelassen oder der IE fragt bei jedem Skript explizit nach, ob es ausgeführt werden soll. Nur wenn der Browser JavaScript von solch einem Server empfängt, wird es ausgeführt. Der Browser entscheidet dies anhand der gesendeten URL.