Login mit php,mysql

Was passiert wenn der Nutzer beim Loginnamen folgendes eingibt:

Klaus';'DROP DATABASE

Dann werden zwei SQL-Statements ausgeführ

Das würde so nicht funktionieren da schon php 4 und neuere Versionen nur mehr einen Sql befehl abschicken.
Aber du hast recht die gefahr von Sql injection ist hier sehr hoch.

Was gehen würde bei diesem oben gepostet script were wenn man
bei username irgendwas eingibt
und bei Password: 'OR 5>2' /*

dann würde die Sql Abfrage so lauten:
SELECT id,password FROM user WHERE login='' Or 2<5 /* '

Und wir währen damit dann schon eingelogt da das ergbniss immer wahr ist.

Die php abrage würde dann lauten:
if ($userData["password"]==$password) // mit anderen worten wenn ""=="" dann einlogen
Also wen nix gleich nix ist dann sind wir eingelogt.

Und schon hat der Angreifer zugang zu deiner Seite

Noch schlimer ist es mit einen anderen Sql befehl
sehen wir uns mal die Zeile an :
echo "Es ist der Benutzer mit der ID $userId angemeldet.";
Mit dem Ausgabe Ergebniss kann man sogar noch ein Password ausgeben das in der Db steht. Wenn man bei der Password eingabe einen anderen Sql befehl eingibt den ich jetzt hier nicht erwähnen möchte.

Mfg Splasch
 
Zuletzt bearbeitet:
Hmmm.. Klingt eigentlich einleuchtend..
Da ihr mir jetzt ein wenig Angst gemacht hab, frag ich mal ob das bei mir auch "möglich" wäre, und wenn ja wie ich mich dagegen schützen kann.

Die Variablen $login und $password werden per POST weitergegeben. Die SQL abfrage lautet wie folgt:

PHP:
if ($data = $sql->Select("SELECT username, id, nachname 
FROM "users" 
WHERE username = '".strtolower($username)."' 
AND password = '".md5($password)."'")) {

Die Wahrscheinlichkeit ist doch eigentlich eh sehr gering, das jemand ein Passwort eingibt, was als MD5 genau das selbe eingibt, was in der Datenbank als MD5 hinterlegt ist. Ein SQL-Befehl wird ja sowieso nicht in MD5 angenommen. Aber wie es mit dem username aussieht, keine Ahnung!
 
Zuletzt bearbeitet:
Die Wahrscheinlichkeit ist doch eigentlich eh sehr gering, das jemand ein Passwort eingibt, was als MD5 genau das selbe eingibt, was in der Datenbank als MD5 hinterlegt ist. Ein SQL-Befehl wird ja sowieso nicht in MD5 angenommen. Aber wie es mit dem username aussieht, keine Ahnung!

Es ist egal in welchen feld man die Sql injection durchführt.Wenn du deine Post Werte vorher nicht valdierst kann man alles möglich da einschleusen

Dein Sql befehl:
SELECT username, id, nachname FROM "users" WHERE username = '".strtolower($username)."' AND password = ' ".md5($password)." '

Um die Sql attacke von oben her zu nehemn nur diesmal gibt man bei usernamen ein und ich geh mal davon aus das die spaltennamen bekannt sind.

username: ' OR 2<5 /*
Ergibt im Sql befehl dann

SELECT username, id, nachname FROM "users" WHERE username = '' OR 2<5 /* ' AND password = ' "sjhskd" '
/* bedeuted ürbings komentar alles was danach kommt wird ignoriert
Also der gültige tatsächliche sql befehl der übergeben wird sieht so aus:

SELECT username, id, nachname FROM "users" WHERE username = '' OR 2<5
(Ergibt wieder true bwz kommt fast einen select gleich ohne where klausel)
Man könne natürlich jede andere sql anweisung hintendran schreiben die man Möchte.

Mfg Splasch

Ps. Natürlich könnte man es auch mit anderen angriff arten versuchen Daten auszulesen. Bsp Cross scripting
 
Zuletzt bearbeitet:
Es ist egal in welchen feld man die Sql injection durchführt.Wenn du deine Post Werte vorher nicht valdierst kann man alles möglich da einschleusen

Dein Sql befehl:
SELECT username, id, nachname FROM "users" WHERE username = '".strtolower($username)."' AND password = ' ".md5($password)." '

Um die Sql atacke von oben her zu nehemn nur diesmal gibt man bei usernamen ein und ich geh mal davon aus das die spaltennamen bekannt sind.

username: ' OR 2<5 /*
Ergibt im Sql befehl dann

SELECT username, id, nachname FROM "users" WHERE username = '' OR 2<5 /* ' AND password = ' ".md5($password)." '
/* bedeuted ürbingd komentar alles was danach kommt wird ignoriert
Also der gültige tatsächliche sql befehl der übergeben wird sieht so aus:

SELECT username, id, nachname FROM "users" WHERE username = '' OR 2<5
(Ergibt wieder true bwz kommt fast einen select gleich ohne where klausel)
Man könne natürlich jede andere sql anweisung hintendran schreiben die man Möchte.

Mfg Splasch

Das ist natürlich schlecht. Aber wie kann man sich dagegen schützen?
 
Hallo,
Für die Php Profis unter euch eher ein Lacher ich kriege hier nix gebacken. Auf http://tut.php-quake.net/login.html#u1
das empfohlene tut. Habe die 2 Dateien in meinen htdoc Ordner kopiert. Obwohl Xampp läuft kommt schon beim Starten der Hinweis das ich einen Testserver einrichten soll, obwohl Xampp läuft.:confused:
 
Zurück