Hey,
bin grade am Website erstellen über PHP in Verbindung mit mySQL und bin an einem kleinen Verständnisproblem angelangt.
Um mySQL injections vorzubeugen benutze ich mysql_real_escape_string. Interessehalber wollte ich mir die Ausgabe anschauen, bzw. wie strings escaped werden.
Dabei stellte ich fest, dass nur ' mit \ escaped wird.
Was aber, wenn die injection ohne irgendwelche string-felder (wie z.B. `password`) abläuft?
Z.B. bei einer Tabelle `benutzer` mit `moderator` als Feld.
In diesem Feld bedeutet 1=true, also Moderator - 0=false also normaler Benutzer.
Wenn ich in der Browserleiste die jeweilige Unterseite dieser Website über s={INDEX_NO} aufrufe und danach eine injection nur über Zahlenfelder teste, funktioniert das doch problemlos, oder?
Bsp.: index.php?s=5 ist der normale Seitenaufruf von Seite 5.
Wenn ich die dann folgendermaßen aufrufe:
index.php?s=5;+UPDATE+`benutzer`+SET+`moderator`=1 ;
wird aber nichts escaped und das Query wird durchgeführt.
Hab mal ne kleine .php file erstellt um das zu testen (analog zum oberen Beispiel):
Output:
Übersehe ich hier irgendwas oder sind weitere Schutzmaßnahmen notwending?
bin grade am Website erstellen über PHP in Verbindung mit mySQL und bin an einem kleinen Verständnisproblem angelangt.
Um mySQL injections vorzubeugen benutze ich mysql_real_escape_string. Interessehalber wollte ich mir die Ausgabe anschauen, bzw. wie strings escaped werden.
Dabei stellte ich fest, dass nur ' mit \ escaped wird.
Was aber, wenn die injection ohne irgendwelche string-felder (wie z.B. `password`) abläuft?
Z.B. bei einer Tabelle `benutzer` mit `moderator` als Feld.
In diesem Feld bedeutet 1=true, also Moderator - 0=false also normaler Benutzer.
Wenn ich in der Browserleiste die jeweilige Unterseite dieser Website über s={INDEX_NO} aufrufe und danach eine injection nur über Zahlenfelder teste, funktioniert das doch problemlos, oder?
Bsp.: index.php?s=5 ist der normale Seitenaufruf von Seite 5.
Wenn ich die dann folgendermaßen aufrufe:
index.php?s=5;+UPDATE+`benutzer`+SET+`moderator`=1 ;
wird aber nichts escaped und das Query wird durchgeführt.
Hab mal ne kleine .php file erstellt um das zu testen (analog zum oberen Beispiel):
Code:
// test.php $injection = "5; UPDATE `benutzer` SET `moderator`=1;"; $string = "SELECT `seitenname` FROM `seiten` WHERE `s`=" . $injection; echo $string . "<br />"; $string = "SELECT `seitenname` FROM `seiten` WHERE `s`=" . mysql_real_escape_string($injection); echo $string . "<br />";
SELECT `seitenname` FROM `seiten` WHERE `s`=5; UPDATE `benutzer` SET `moderator`=1;
SELECT `seitenname` FROM `seiten` WHERE `s`=5; UPDATE `benutzer` SET `moderator`=1;
SELECT `seitenname` FROM `seiten` WHERE `s`=5; UPDATE `benutzer` SET `moderator`=1;
Kommentar