Dennis: SQL Code-Einschleusung

Beitrag lesen

Hi Rouven,

2.2: Das " ist nicht maskiert, da $passwort mit ' begrenzt ist
hmh, das fällt mir im Moment schwer zu raten was da passiert. Wenn PHP das tatsächlich einfüllt, dann käme da
"SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te"st'"
raus
--> ungültiger String, Syntaxfehler, aber ich glaube soweit kämst du nicht

Nix da - PHP setzt da ganz korrekt einfach ein " in den String. Ich glaube du hast da ein kleines Verständnis-Problem. Wenn du den Wert einer Variable im Script festlegen willst, musst du das String-Begrenzer-Zeichen (in diesem Fall also ") maskieren, damit PHP beim parsen weiß, dass der String da noch nicht zu Ende ist:

$foobar = "blub"blubb";

Was aber PHP letzendlich speichert ist:

$foobar => blubb"blubb

Wenn nun magic_quotes aktiviert sind, werden alle " in $_POST und $_GET Daten durch " ersetzt, im Speicher steht dann also:

$_POST['foobar'] => blubb"blubb

Um das im Script zu erreichen müstest du schreiben:

$_POST['foobar'] => "blubb\"blubb";

Der erste Backslash maskiert den zweiten und der dritte Backslash maskiert das Anführungszeichen.

Es kommt also in diesem Fall keineswegs zu einer PHP-Fehlermeldung oder so - nein, es wird korrekt ein MySQL-Query abgesetzt, der aber nach einem Datensatz sucht, wo der Username wirklich foo"bar lautet.

Szenario 3a, und hier wirds eigentlich interessant
Nutzer gibt "test" und "te'st" ein
ohne Escapen ergibt das
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te'st'"
--> das ist für PHP ein gültiger String, aber MySQL findet
SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te'st'
und das ist nicht richtig gequotet

Richtig, was passiert? Das gibt einen MySQL Fehler, wenn man statt mysql_query(...) immer mysql_query(...) OR die(mysql_error()); schreibt, bekommt man den auch schön angezeigt.

Und an dieser Stelle wäre nun auch eine SQL Injection problemlos möglich gewesen:

Nutzer gibt "administrator" und "weißichnicht' OR 1 #" ein
--> "SELECT name, passwort FROM user WHERE user = '$username' AND passwort = '$password'"
--> SELECT name, passwort FROM user WHERE user = 'administrator' AND passwort = 'weißichnicht' OR 1 #'

Durch das OR 1 ist es egal was das Passwort ist, durch das # wird das nachfolgende ' als Kommentar betrachtet (sonst gäbe das nämlich noch einen MySQL-Error) und damit ist es dem Angreifer gelungen sich als administrator einzuloggen, ohne dem sein Passwort zu kennen.

Szenario 3b:
"test" und "te''st"
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te''st'"
--> für MySQL:
SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te''st'
Hier stimmt zwar die Anzahl der Quotes, aber ... AND passwort = 'te' ist fertig, das 'st' steht alleine in der Luft --> Syntax-Error

Falsch - das te''st wird escaped zu te''st, genau das wird für $passwort eingesetzt und MySQL sucht nach einem Benutzer namens te''st - es gibt keinen Syntax-Error.

Ich glaube, du hast da selber noch ein paar Verständnisprobleme.

MfG, Dennis.