Alexander Foken: Sicherheitsproblem ?

Beitrag lesen

Hallo

Moin Moin!


$dbh = dbmopen("./data/$nick", "c")
dbminsert($dbh, "nickname", $nick);

[...]

dbmclose($dbh);

Mit folgendem Formular kann man die Daten editieren:
hier treten die Fehler zum ersten mal auf.


[...]

print "<input name="nick" value="$nick" type="hidden" size="25">";

[...]

Wenn sich nicht ganz auf dem Schlauch stehe, erlaubst Du dem User, seinen Nickname selbst festzulegen (ist ja auch wohl üblich so). Den Nickname in $nick benutzt Du dann ungeprüft, um eine Datei im Dateisystem zu öffnen.

*** RED ALERT! INTRUDER DETECTED! ***

Ich weiß nicht genau, wie dbmopen reagiert, wenn es Zeichen wie `` | > < ; * ? \ <NUL> im Dateinamen findet. Wenn die darunterliegende C-Funktion nur ein fopen() macht, ist das OK. Wenn nicht, hast Du ein Problem. Überleg mal, was passiert, wenn ich als Nickname folgendes eingebe:

../../../../../../../../../../../etc/passwd

oder für Windows 95/98:

../../../../../../../../../../../io.sys

oder für Windows NT/2000:

../../../../../../../../../../../ntldr

Zweite Sache: Wenn $nick einen User eindeutig kennzeichnet, warum schreibst Du $nick in eine "Datenbank", die extra für $nick angelegt wurde ? Wolltest Du nicht alle Nicknames in eine Datei schreiben ?

Alexander