Samstag, 31. Juli 2010 |
Cross-Site-Scripting-Schwachstellen wurden bereits in About Security #14 und #15 vorgestellt. Allgemein gesagt, wird beim Cross-Site Scripting (XSS) das Vertrauen des Benutzers bzw. seines Browsers in eine Webseite ausgenutzt: "Von einer vertrauenswürdigen Webseite mitgelieferter JavaScript-Code ist vertrauenswürdig". Diese so genannte Same Origin Policy erlaubt dem JavaScript-Code, die Seite zu ändern und vom eigenen Server Daten nachzuladen. Nach der Beschreibung der Grundlagen in About Security #14 und #15 geht es jetzt weiter ins Detail.
Während früher nur zwei Arten von XSS (reflektiertes und persistentes) bekannt waren, ist durch die intelligenteren Clients des Web 2.0 eine dritte hinzugekommen: DOM-basiertes oder lokales XSS. Damit werden jetzt folgende drei Arten von XSS unterschieden:
N E U ! Security
aktuell
Täglich aktuelle Security-Infos!
Reflektiertes und am Rande auch persistentes XSS wurden bereits in About Security #14 und #15 beschrieben, im Folgenden geht es daher speziell um DOM-basiertes XSS. Diese Schwachstellen wurden erstmals 2005 von Amit Klein in seinem Paper "DOM Based Cross Site Scripting or XSS of the Third Kind" beschrieben.
DOM-basiertes XSS unterscheidet sich in einem Punkt von reflektiertem oder persistentem XSS: Der Schadcode ist zu keiner Zeit Bestandteil der vom Server gelieferten "rohen" HTML-Seite – der Server, ein IDS/IPS oder eine Web Application Firewall können ihn darin also nicht erkennen.
Eine Webseite ist immer dann für DOM-basiertes XSS anfällig, wenn
sie Daten aus vom Angreifer kontrollierbaren Objekten wie z.B.
document.location, document.URL
oder
document.referrer ohne Prüfung auf
eingeschleusten Code
verwendet. Ein einfaches Beispiel (nach Amit Klein, "DOM Based Cross
Site Scripting or XSS of the Third Kind"):
Eine Webseite enthält den folgenden Code:
Hallo
<script>
var pos=document.URL.indexOf("name")+5;
document.write(document.URL.substring(pos,document.URL.length));
</script>
Willkommen auf dieser Seite ...
Beim Aufruf dieser Seite wird der Benutzer mit seinem Namen begrüßt, z.B. beim Aufruf von
http://www.beispiel.example/index.html?name=Anton
Der übliche XSS-Test mit
http://www.beispiel.example/index.html?name=<script>alert('XSS')</script>
führt dagegen zum Öffnen der Alertbox.
Dieses Beispiel funktioniert nicht, wenn der Webbrowser den URL selbstständig URL-kodiert, wie es z.B. Mozilla und Firefox tun. Dadurch werden die < und > zu %3C bzw. %3E, was die spätere Codeausführung verhindert. Die Umkodierung verhindert aber keine Angriffe, die nicht auf < und > angewiesen sind.
Der Angriff ist möglich, weil der Browser beim Aufruf des
präparierten URLs einen HTTP-Request an
www.beispiel.example sendet, die statische
HTML-Seite mit
obigen Code darin empfängt und dann beginnt, die HTML-Daten in das DOM
zu parsen. Das DOM enthält das Objekt document,
das die
Eigenschaft URL besitzt, in der der URL der
aktuellen Seite
steht. Erreicht der Parser den JavaScript-Code, führt er ihn aus und
ändert entsprechenden den enthaltenen Anweisungen die Seite. Der Code
kopiert einen Teil des Inhalts von document.URL
in die
HTML-Seite. Im Beispiel also "Anton" – oder
eben den
Schadcode
"<script>alert('XSS')</script>".
Das
Ergebnis sieht im zweiten Fall folgendermaßen aus:
Hallo
<script>alert('XSS')</script>
Willkommen auf dieser Seite ...
Die fertiggestellte HTML-Seite wird dann geparst – und dabei der eingeschleuste Skriptcode ausgeführt.
In der nächsten Folge werden u.a. die Tarnung des Schadcodes und mögliche Gegenmaßnahmen behandelt.
Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!
About Security – Übersicht zum aktuellen Thema "Sichere Webanwendungen – Cross-Site Scripting"