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

aXiEd

Mitglied
Thread Starter
Mitglied seit
01.08.2006
Beiträge
884
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?
 

Sojus

Mitglied
Mitglied seit
30.05.2006
Beiträge
144
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.
 

aXiEd

Mitglied
Thread Starter
Mitglied seit
01.08.2006
Beiträge
884
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 ;)
 

Atarimaster

Mitglied
Mitglied seit
06.08.2007
Beiträge
708
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.
 

aXiEd

Mitglied
Thread Starter
Mitglied seit
01.08.2006
Beiträge
884
Hallo, kannst du mir bitte vielleicht etwas genauer erklären was du damit meinst?

Zudem verhindert
Code:
$name = basename($_FILES["picture"]["name"]);
dass »Einschmuggeln« eines Pfades.
 

Atarimaster

Mitglied
Mitglied seit
06.08.2007
Beiträge
708
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...
 

aXiEd

Mitglied
Thread Starter
Mitglied seit
01.08.2006
Beiträge
884
Ok verstanden. Vielen Dank Atarimaster. :)
 

wegus

Moderator
Mitglied seit
13.09.2004
Beiträge
17.375
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!
 
Oben