[HowTo] SQL Injektion

10/05/2009 12:57 kerby499#1
Dies ist ein kurzes HowTo, um zu verstehen was mit einer SQL-Injektion gemeint ist und wie sich diese ausnutzen lässt. Diese Methode basiert grundsätzlich auf der ungenügenden
Prüfung von Benutzereingaben und lässt sich fast immer vermeiden.
Oftmals denken Programierer zum Zeitpunkt des Codings nicht daran, welches Schadenspotiential das ungeprüfte Weiterreichen von Benutzereingaben an den SQL-Interpreter.
Dabei kommen in keinster Weise Buffer-Overflows zum Einsatz oder sonstige Hacks.

1: Punkt Kennwortloser admin Zugang mittels OR Injektion:

Die wohl am häufigsten ausgenutzete Möglichkeit der SQL-Injektion ist die Benützerauthentisierung.
Dabei geht es oft wie folgt vor:

Eingabefeld(Variable $user): User
Eingabefeld(Variable $pass): Passwort:


Dies resultiert dann in einem etwas so lautenden SQL-Befehl:
( Anmerkung: Zur Veranschaulichung soll dies kein direkt lauffähiger Code sein sondern lediglich Pseudocode)

SELECT * from users WHERE user='$user' AND password='$pass'

Der normale Benutzer gibt jeweils seinen Usernamen an darauf gefolgt sein Passwort.
Beispiel: User = admin
Pass = geheim

SELECT * from users WHERE user='admin' AND password='geheim'

was passiert aber wenn der Benutzer nicht sein Kennwort angibt, sondern SQL-Befehle ?

Beispiel: User = admin
Pass = ' or '1' = '1

Beachtet bitte das führende ' und dass am Ende KEIN ' angegeben wird. Somit wird bei einer ungeprüften
Verarbeitung folgender SQL-Code erzeugt:

SELECT * from users WHERE user='admin' AND password=' ' or '1' =' 1'

Dies hat zur Folge, dass die logische Prüfung erweitert bzw umgewandelt wurde. Nämlich in 2 Teile:

- password=' ' or '1' =' 1'

Dies ist eine ODER-Verknüpfung, die immer war ist ( 1 = 1 ) somit TRUE

Substituiert folgt die zweite:

- user = 'admin' AND TRUE

Somit liefert die Abfrage ein positives Ergebnis genau dann, wenn es eines Benutzer gibt der 'admin' lautet.
Dass Passwort muss man garnicht wissen, da die Überprüfung umgangen wurde und man hat passwortlosen
Zugang.


2: Punkt Kennwortloser admin Zugang mittels Kommentar Injektion:

Gleiches Beispiel lediglich den Usernamen ändern wir ab:

User: admin' /*

Wichtig ist dass Leerzeichen zwichen ' und /*

Darauf folgt folgendes SQL-Statement:

SELECT * from users WHERE user ='admin' /* AND password='<irgendwas>'

Die Zeichenfolge /* leitet einen Kommentar ein und da kein schließendes */ angegeben wird wird alles was hinter /* steht ignoriert. Der resultierende SQL-Befehl lautet dann:

SELECT * from users WHERE user='admin'

Voila, sobald der Benutzer admin existiert hat man Zugang


3. Punkt Auslesen alle Benutzer und Kennworter mittels UNION SELECT

Um dieses Beispiel nachzuvollziehen ist ein wenig Kenntniss des Datenbankaufbaus oder der Abfrage
nötig. Dies ist aber i.d.R. nach wenigen Minuten browsen schon erledigt.
Man benütigt eine Seite aus der man quasi das Statement ableiten kann. Anfällig sind da Seiten,
die z.B. eine ID in der URL übergeben.

Z.B. sowas in der Art.

http://<webseite>?docuid=55


Möglicherweise wird darauf ein SQL-Statement generiert, welches etwas so aussieht:

SELCECT dokument from dokumententabelle WHERE DOCUID='55'

Der Angriff sieht hier nun vor, dass wir einfach das SQL-Statement erweitern.Nämlich um ein
UNION Feld. Dies hat zur Folge, dass die Ausgabe um das angefügte SQL-Statement ergänzt wird.

zb. in

SELCECT dokument from dokumententabelle WHERE DOCUID='55' UNION SELECT user,password from users

D.h. die URL muss dann so aussehen:

http://<webseite>?docuid=55%20%27UNION%20SELECT%20user%2C pass%20from%20users

Dabei werden entsprechenden ASCII-Zeichen in der URL angegeben:

%20 = Leerzeichen
%27 = '
%2C = ,

Als Ergebnis kommt dann neben dem Dokument noch eine Ausgabe aller Usernamen und gehashten Passwörten
zurück
10/05/2009 14:42 MoepMeep#2
Gut geschrieben, hier allerdings sicherlich nicht gern gesehen ;D
10/05/2009 14:44 bloodx#3
lol'd

start->ausführen->1337Haxx0r->www.billgates.com->MoneyTransfer->MyBank :D
10/05/2009 17:07 Ende!#4
Gut geschrieben, aber was neues war für mich leider nicht dabei ^^

Aber ich bin mir sicher, dass einige Metin2 Kiddys jetzt alle oben genannten Möglichkeiten hier im Forum ausprobieren ;D

Auch wenn für mich nix neues dabei war, bekommste für die Mühe nen Thanks xD
10/06/2009 12:51 !Kott-Lätt!#5
sieht man nicht gerne heir ;)
10/06/2009 18:08 Pand0r#6
Tutorial dagegen, sprich wie man sich alles schützt, wäre interesannter.

lg,
pand0r