Donnerstag, 24. Mai 2012 |
| |
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, 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 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)')">
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!
About Security – Übersicht zum aktuellen Thema "Sichere Webanwendungen – Webwürmer"