Mit PHP möglich /etc/passwd zu überschreiben?

aXiEd

aXiEd

Aktives Mitglied
Thread Starter
Dabei seit
01.08.2006
Beiträge
885
Reaktionspunkte
68
Nehmen wir mal an man habe folgendes Script welches einen Datei-Upload verarbeitet.

$tmp_name = $_FILES["picture"]["tmp_name"];
$name = $_FILES["picture"]["name"];
move_uploaded_file($tmp_name,"uploaded_pictures/$name");

Die Frage: Wie kann ein User dieses Script missbrauchen um /etc/passwd zu überschreiben?

Bisher dachte ich dass man einfach ein PHP-Script hochlädt, welches Shell Komandos ausführt. Oder funktioniert das nicht aus Sicht der Rechte? Gibt es andere Möglichkeiten?
 
Solange dein Apache nicht mit Root rechten läufft kann kein PHP Script passwd einfach so übschreiben.

ls -lsa /etc/passwd
8 -rw-r--r-- 1 root wheel 2888 Sep 23 2007 /etc/passwd

Dazu müsste sich der Angreiffer auf eine Art Root Rechte verschaffen, zbs mit dem Passwort (sehr Trivial) oder mit einer Apache sicherheitslücke.
 
Hm okay, deswegen wundert es mich jetzt auch nicht mehr warum die Datei in der Aufgabe /etc/password anstatt /etc/passwd heißt... Danke sehr ;)
 
Wenn Du ganz sicher gehen willst, dass da nichts Unrechtmäßiges hochgeladen wird:
Es geht ja offensichtlich um den Upload von Grafiken – prüfe die hochgeladene Datei einfach mit getimagesize(), das sagt Dir zuverlässig, ob es sich auch tatsächlich um eine Grafik handelt (anders als z.B. das Prüfen des vom Browser übergebenen MIME-Type oder der Dateiendung).

Zudem verhindert
Code:
$name = basename($_FILES["picture"]["name"]);
dass »Einschmuggeln« eines Pfades.
 
Hallo, kannst du mir bitte vielleicht etwas genauer erklären was du damit meinst?

Naja, es könnte ja jemand einen Dateinamen übergeben, der irgendwie lautet wie »../../../pfad/zu/einem/sensiblen/ziel«.
Dein Script macht daraus dann zwar »uploaded_pictures/../../../pfad/zu/einem/sensiblen/ziel« – aber das nützt nix, das Script würde sich trotzdem den Verzeichnispfad hoch- und wieder runterhangeln und die Datei ggf. in einem Verzeichnis speichern, wo sie nicht hinsoll.

Es ist zwar eher unwahrscheinlich, dass er dadurch etwas Schlimmes anstellen kann; aber eben nicht unmöglich und mit dem einfachen basename() zu verhindern...
 
Ok verstanden. Vielen Dank Atarimaster. :)
 
Im O'reily Buch zum Apache Httpd hab ich mal einen schönen Satz gelesen:

It is possible to share /etc/passwd for the system and httpd/htaccess, but when you do so you will immediatly loose all of your UNIX Skillpoints

Will sagen nat. geht so etwas, das Sicherheitsrisiko ist aber so hoch das der berühmte "man" so etwas nicht macht!
 
Zurück
Oben Unten