security

Never trust user input – PHP Fehler Nr. 1

Thursday, February 5th, 2009 | PHP | 3 Comments

<?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: , ,