+++ SQL Injection finden +++ by WooMic

Bevor du dich mit diesem HowTo ausseinandersetzt lese "Wie lerne ich SQL Injection" und verstehe z.B: query,include,HEx,POST,GET, etc ...

SQL Injections finden ist der (meiner Meinung nach) schwierigster Teil des ganzen.
Man muss viel probieren, weil jedes Script anders sein kann und es unterschiedliche SQL Server gibt. Zuerst noch vorweg, diese Angriffsmethode gilt theoretisch für jedes Script das über SQL auf einer Datenbank arbeitet.

Die meisten SQL Injections finden sich in der URL oder irgendeiner <form> (POST und GET Request). Im Prinzip ist aber
jede Information eine potentielle SQL Injection solange die Information von uns in einem QUery integriert wird und veränderbar ist (z.B: HTTP Headers, User Agent).

In dem man versucht dem Script anstatt normale Werte nicht erwartete (und hoffentlich nicht abgefangene) Zeichen zu übergeben können für uns sehr wichtige Fehlermeldungen entstehen.
zu grosse Zahlen,0,negative Zahlen,NULL,%00 (NULL in Hex),' ,\' , %27, Buchstaben, ... u.s.w.

Key: Key: /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix

Es gibt nun verschiedene Möglichkeiten wie die Seite reagieren kann:

- Es kann sein das eine Datenbank Fehlermeldung kommt. Vielleicht sogar mit dem genauem Fehler (syntaxfehler: ' *sqlcode* '). Oder wenn man ganz viel Glück hat mit dem kompletten Query.

- Es kann aber auch sein das wir keine Fehlermeldung angezeigt bekommen. Als Resultat erhalten wir einfach keine Daten. Das kann sich nun auch um die dritte Möglichkeit handeln aber generell bedeutet dass, das über das script keine Fehlermeldungen und keine Daten ausgegeben werden. Meistens führt das dann zu einer BLIND SQL Injection

- Die letzte Möglichkeit ist, das wir zur Hauptseite geleitet werden, eine im Script Programmierte Warnung angezeigt bekommen oder ähnliches. Das bedeutet das wir es (noch) nicht geschafft haben das Script auszutricksen und wir es weiter oder anderswo versuchen müssen. Beachte auch! dass an der probierten Stelle eventuell gar nicht auf eine Datenbank zugegriffen wird. Das ist natürlich zwingend notwendig -.-

Als nächstes Versuchen wir einen SQL Code einzufügen. Praktisch dafür ist AND 1=1 weil das Resultat das gleiche bleibt. Allerdings muss er zu dem bereits bestehenden Query passen und darf keinen Syntaxfehler erzeugen. Zum Beispiel wenn news vulnerable ist:

w00mic.php?news=3

Zuerst können wir versuchen irgend einen sql code anstatt der zahl eingeben.

w00mic.php?news=concat(3)
w00mic.php?news=(2+1)

Oder wir Versuchen mit AND 1=1 genau das gleiche Resultat zu erziehen. Wir nehmen news 3 weil je nach script kann es sein das es bei einem nicht funktionierendem Query auf die erste Seite springt.

w00mic.php?news=3 AND 1=1
oder
w00mic.php?news=3' AND 1=1

Wenn sich auf der Website nichts verändert hat bedeutet das, das wir erfolgreich SQL auf der Seite injected haben. Um sicher zu sein könnte man noch mit OR 1=1 alle News oder mit AND 1=0 keine News ausgeben. AND und OR können wir (fast) immer einfügen weil wir uns im Query (normalerweise) im WHERE Teil befinden. Damit aber später auch sicher jeder Befehl funktioniert, sollten wir den Rest des Querys auskommentieren. Mögliche Kommentarbefehle sind:

/*
--
#

Durch das auskommentieren kann es aber passieren, dass man z.B: eine schliessende Klammer oder ähnliches mit auskommentiert und man desshalb einen Syntaxfehler erhält.
Die schliessende Klammer müsste man dann also vor dem auskommentieren noch mit einbauen. z.B:

wOOmic.php?news=3) *SQLCODE* /*

- Zuerst nehmen wir 3 um zu sehen ob die korrekten daten (news 3 ausgegeben werden). Weil es sein kann das er bei einem fehler zur nr 1 springt.
- Dann schliessen wir die Klammer damit der SQL Syntax korrekt ist. (Das ist sehr unterschiedlich! Darum sollten SQL Grundkenntnisse vorhanden sein!)
- Dann können wir (müssen aber nicht) einen SQL Code eingeben. Wie bereits beschrieben ist AND und OR am besten geeignet für eine Überprüfung.
- Zum Schluss kommentieren wir aus damit wir später keine doppelten Befehle haben (z.B. group by, weil dieser Befehl doch öfters vorkommt). Allerdings muss man hier wieder probieren und denn Query verstehen, weil es sein kann das man den restlichen Query nicht auskommentieren kann.

Eine Blind SQL Injection ist einfach eine normale SQL Injection aber ohne Fehlermeldungen. Das bedeutet, dass man durch Ja/Nein Fragen step by step zum ziel kommt.

An diesem Punkt haben wir die Injection lokalisiert und wir werden im nächsten Tut uns dann in der Datenbank bewegen.

Greetz WooMic