dasEpp PHP Gästebuch Sicherheitslücke

Das PHP-Gästebuch von das-epp in der Version 2.2.1 und wahrscheinlich auch seine Vorgängerversionen enthalten einen kritischen Fehler, der inzwischen mit der Veröffentlichung einer neuen Version behoben wurde.

Dort ist es möglich beliebige Dateien, auf die PHP Zugriff hat, herunterzuladen. Voraussetzung ist allerdings, dass register_globals eingeschaltet ist. Möglich wird der Zugriff durch eine fehlende Initialisierung der Variable $name_bild in der Datei includes/upload_image.inc.php. Diese Variable wird nur gesetzt, wenn ein Bild erfolgreich hochgeladen werden konnte. Ist das nicht der Fall, so kann man – bei der oben genannten Voraussetzung – die Variable selber belegen. Der Wert dafür kann zum Beispiel ein beliebiger Dateiname sein. Da die Variable später nicht mehr geprüft wird, sondern in der Datei eintrag.php einfach übernommen und in die Datenbank geschrieben wird, lassen sich so beliebige Werte in die Datenbank speichern. Das alles lässt sich mit einem curl-Befehl erledigen:

curl -F "mail=" -F "icq=" -F "betreff=" \
-F "text=dein-text" -F "user=dein-name" \
-F "name_bild=deine-datei.php" \
http://<host>/<pfad zum gästebuch>/eintrag.php

Teilweise ist auch noch ein Anti-Spam-Cookie nötig, der mit dem Parameter -b dasepp_php_gb_antispam=<der wert> gesetzt werden kann.

Soweit die „Vorarbeit“. Nun kommt die Datei schowimage.php ins Spiel, die es einerseits ermöglicht Bilder anzusehen und andererseits – das ist hier interessant – herunterzuladen. Kennt man die ID des eben manipulierten Eintrages (sie steht zum Beispiel vor jedem Gästebucheintrag), so genügt ein Aufruf wie schowimage.php?id=1&act=save und die oben angegebene Datei kann – sofern sie für PHP lesbar ist – heruntergeladen werden.

Lädt man die Konfigurationsdatei des Gästebuches herunter (includes/optionen.inc.php), so kann man den Einbruch nach dem Herunterladen vertuschen, indem man den betreffenden Gästebucheintrag einfach löscht.

curl -F "del_passwort=das-admin-passwort" -F "id=1" \
http://<host>/<pfad zum gästebuch>/loeschen.php

Aber Vorsicht! Sofern PHP Schreibrechte für die oben eingetragene Datei hat, wird sie unwiederruflich vom Server gelöscht!

Die Lösung des Problems habe ich zwar noch nicht getestet, aber es sollte reichen die folgende Zeile an den Anfang der Datei includes/upload_image.inc.php zu kopieren.

$name_bild = '';

Damit wird die Variable beim Aufrufen des Skriptes belegt, also initialisiert, und ist nicht mehr durch den Benutzer definierbar.


#0008, erstellt: 2008-10-05, aktualisiert: 2009-06-05, src, meta
Start, Impressum, zurück: Der tägliche Wahnsinn im Kinderzimmer, vor: Easy Banner: Code einschleusen