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







