Never trust user input – PHP Fehler Nr. 1

Thursday, February 5th, 2009 | PHP

<?php
readfile(ROOT_DIR . "/" . $_GET["file"]);
?>

Wer kennt diese Zeilen nicht? Jeder der sich einmal mit PHP beschäftigt hat wird bei diesen Zeile schnell aufmerksam. Meistens findet man diese drei Zeilen in einer download.php, navigation.php oder image.php.

In der Website steht dann <a href=”/download.php?file=/files/antrag-02-2009.pdf”>Antrag Februar 2009</a> oder als Bild <img src=”/img.php?file=/images/thumbnails/01.jpg” />.

Doch der Programmier hat hier eine der wichtigsten Regeln nicht beachtet:

Never trust user input

Jede Benutzereingabe ist evil und muss überprüft werden. Wenn man solche Scripte in freie Wildbahn findet, kann man nur hoffen, dass der Programmierer lediglich ein Hobby-Projekt betreut(e).

Ein $Script-Kiddie würde diese Adresse etwas verändern und darauf hoffen, dass ein Amateur am Werk war:

/download.php?file=index.php

Würde bei unserem Beispiel die index.php als Quellcode ausliefern. Prinzipiell lässt sich damit jede Datei aufrufen, auf die PHP zugreifen kann. Bei einem schlecht konfigurierten Server ist so unter Umständen schnell der ganze Server betroffen. Letzters traf vor einigen Jahren auch den Sat. 1 “Computer- und Internetexperten” Peter Huth; nach einem Bericht auf Heise wurde der Server kompromittiert.

Noch schlimmer wäre es übrigens, wenn man readfile() durch include() ersetzt. Damit würde eine PHP-Datei von einem fremden Server geladen und ausgeführt. Damit könnte man seine eigene Scripte auf dem Server ausführen! Bei einem guten Hoster ist man davor jedoch geschützt, bzw. man setzt selbst ini_set(“allow_url_include”, false) in seiner Anwendung.

Bei Google findet man mit einfachen Abfragen direkt etliche Kandidaten mit dieser Sicherheitslücke Einladung.

Zum Schluß hab ich noch einen Link zu einem kurzen Tutorial rausgesucht.

Tags: , ,

3 Kommentare to Never trust user input – PHP Fehler Nr. 1

Susann
February 25, 2009

Das kann ich nur bestätigen. Man kann sich sicher sein, dass alles, aber auch wirklich alles, ausprobiert wird um “böse” Sachen zu versuchen. Darauf zu vertrauen, dass ein User wenn er nach der Email gefragt wird auch nur die Email eingibt wäre fahrlässig.
Gerade was man in Kommentaren an Codes findet … 😉
Es hilft nur jede Texteingabe zu überprüfen. das ist zwar aufwändig, aber allemal besser als ein gehackter oder zerstörter Server.

Technikpedia
March 5, 2009

Da habe ich auch schon die tollsten Sachen erlebt. Aber am Anfang tappt man fast immer in solche kleinen Fettnäppchen hinein. Woher soll man es auch besser wissen. Man lernt halt nur durch erfahrung!

Valentin
April 9, 2009

Lernen durch Erfahrung ist doch etwas riskant in dem Bereich, habe mir ein Buch über PHP Sicherheit gekauft, dadurch programmiere ich jetzt um einiges sicherer, (Hoffe ich…)