Samstag, 17. September 2011


Topthema

Donnerstag, 10. Januar 2008 | Topthema

About Security #138: Webwürmer (1): Samy, der MySpace-Wurm

(Link zum Artikel: http://www.entwickler.de/php/kolumnen/040470)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Ab dieser Folge geht es um eine neue Bedrohung, die im wahrsten Sinne des Wortes durchs Web krabbelt: Webwürmer, Web-2.0-Würmer, AJAX-Würmer, XSS-Würmer, wie auch immer man sie nennen möchte. Hier werden sie im folgenden Webwürmer genannt, da sie nicht zwingend auf Web-2.0-Fähigkeiten oder AJAX angewiesen sind, auch wenn ihnen das Web 2.0 die Verbreitung erleichtert. Und auch XSS-Schwachstellen sind nicht zwingend notwendig, sofern die betroffenen Seiten JavaScript ganz regulär zulassen. Streng genommen handelt es sich bei manchem so genannten Webwurm sogar 'nur' um einen Webtrojaner: Würmer verbreiten sich selbstständig, Trojaner sind auf die Mithilfe der Benutzer, meist das Starten eines Programms oder in diesem Fall das Öffnen einer Webseite, angewiesen.

Der erste seiner Art: Samy

Der erste, oder zumindest der erste allgemein bekannt gewordene, Webwurm wurde am 4. Oktober 2005 auf MySpace losgelassen. Samy (der Autor des Wurms) war der Ansicht, er hätte zu wenig Freunde auf MySpace. Samy (der Wurm) sollte dieses Problem beseitigen. Ausgehend von der Profilseite seines Programmierers verbreitete sich der Wurm über eine persistente XSS-Schwachstelle in die Profilseiten der Besucher einer befallenen Seite. Über einen XMLHttpRequest wurde Samy zum Freund und 'Hero' des Besuchers gemacht und der Wurmcode in dessen Profilseite integriert. Innerhalb von 20 Stunden hatte Samy (der Autor) mehr als 1 Million Freunde und Samy (der Wurm) entsprechend viele Seiten verseucht. MySpace musste den Betrieb vorübergehend komplett einstellen, um den Wurm zu stoppen und alle befallenen Seiten zu reinigen.

Die Technik hinter Samy

Die folgenden Informationen stammen zu einem großen Teil aus Samys eigener Beschreibung. Die Methoden, um MySpaces Filter zu umgehen, werden einigen Lesern bekannt vorkommen: Man findet sie z.B. auch im schon öfter erwähnten XSS Cheat Sheet. Das Wort 'Beispiel' ist teilweise mit einem entsprechenden Teil des Samy-Quelltexts verlinkt, der sich auf dieser Extraseite befindet.

N E U ! Security aktuell
Täglich aktuelle Security-Infos!

1. MySpace blockierte die meisten HTML-Tags, insbesondere <script>-Tags, HREF-Tags mit JavaScript usw. Was nicht gefiltert wurde, waren CSS-Tags. Samy nutzte aus, dass einige Browser, z.B. der Internet Explorer und einige Safari-Versionen, JavaScript-Code in CSS-Tags auswerten. Dadurch funktionierte der Wurmcode nicht in jedem Browser, aber es blieben genug potenzielle Opfer übrig.
Beispiel: <div style="background:url('javascript:alert(1)')">

2. MySpace filterte die Zeichenkette "javascript" überall aus – nicht aber "java\nscript", was von einigen Browsern als "javascript" interpretiert wird (\n ist ein Zeilenumbruch, Newline).
Beispiel: <div style="background:url('java
script:alert(1)')">

3. Innerhalb des <div>-Tags konnten keine Quote-Zeichen verwendet werden, da sowohl ' als auch " bereits verwendet wurden. JavaScript ohne Quote-Zeichen ist ziemlich schwierig zu programmieren. Als Ausweg wurde der JavaScript-Code in einem Ausdruck gespeichert und dann mit seinem Namen aufgerufen und ausgeführt. Dadurch konnte das einfache Quote-Zeichen (') verwendet werden.
Beispiel: <div id="mycode" expr="alert('Hallo!')" style="background:url('java
script:eval(document.all.mycode.expr)')">

4. Außer einfacher Quote-Zeichen (') wurden auch doppelte Quote-Zeichen (") benötigt. Das maskieren (escape, z.B. foo\"bar) funktionierte nicht, da MySpace alle maskierten Quote-Zeichen ausfilterte. Als Ausweg wurden die doppelten Quote-Zeichen mit der Funktion String.fromCharCode() aus ihrem Dezimalcode erzeugt.
Beispiel: <div id="mycode" expr="alert('Doppeltes Quote-Zeichen: ' + String.fromCharCode(34))" style="background:url('java
script:eval(document.all.mycode.expr)')">

About Security: Die komplette Serie

5. Um den Wurmcode auf die Profilseite des Opfers zu kopieren, musste auf den Quelltext der Seite zugegriffen werden, um daraus die ID des Benutzers zu lesen. Eigentlich ginge dies über document.body.innerHTML – wenn MySpace nicht die Zeichenkette "innerHTML" überall ausgefiltert hätte. Als Ausweg wurde "innerHTML" in einem eval()-Aufruf aus zwei Strings zusammengesetzt:
Beispiel: alert(eval('document.body.inne' + 'rHTML'));

6. Bei der Suche nach der ID des Benutzers, "friendID", würde man unter Umständen den eigenen Code finden, der diese Zeichenkette ja auch enthält. Daher muss das zu suchende Wort ebenfalls zusammengesetzt werden. Der gleiche Fall tritt auf, wenn der Wurmcode für die Weiterverbreitung von der aktuellen Seite gelesen wird.
Beispiel: var index = html.indexOf('m' + 'ycode');

7. Um die Profilseite des Opfers zu ändern, wurden XMLHttpRequests verwendet. Das ginge zwar auch ohne, z.B. über versteckte iFrames, aber der im Hintergrund ablaufende XMLHttpRequest ist deutlich unauffälliger, außerdem werden die für den Angriff benötigten Cookies automatisch mitgeliefert. Das für die Durchführung der XMLHttpRequests notwendige "onreadystatechange" wurde von MySpace ausgefiltert und daher ebenfalls in einem eval()-Aufruf zusammengesetzt.
Beispiel: eval('xmlhttp.onread' + 'ystatechange = callback');

In der nächsten Folge wird die Beschreibung von Samy fortgesetzt.

Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!

Carsten Eilers

About Security – Übersicht zum aktuellen Thema "Sichere Webanwendungen – Webwürmer"

Kommentare

Folgende Links könnten Sie auch interessieren