PHP

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

Umfrage-Tool und IP-Sperre

Sunday, March 2nd, 2008 | PHP | 2 Comments

Ich hab in der letzten Woche ein kleines Umfrage-Tool geschrieben. Damit jemand nur einmal abstimmen kann, setze ich neben einem Cookie auch noch auf eine IP-Sperre.

Generell ist eine IP-Sperre aber problematisch, viele Firmen haben einen Internetanschluß mit mehreren Users. Der Router macht NAT und die x User gehen über eine öffentliche IP ins Internet. Aus so einem Netz könnte man natürlich auch nur einmal abstimmen. Auf der anderen Seite gibt es Internetprovider, die ihre User über Zwangsproxies leiten, damit kann es sein, dass zwei Requests von einem User, die wenigen Sekunden auseinander liegen, von verschiedenen IPs kommen. AOL setzt oder setzte auf einen Zwangsproxy.

Bei dem Umfrage-Tool nutze ich veschiedene Faktoren, damit ich eine doppelte Abstimmung verhindern kann. Wie schon geschrieben ist ein Faktor die IP-Adresse, für das Testen der IP-Sperre habe ich ein kleines Script in PHP5 geschrieben, das automatisch Verbindungen über einen öffentliche Proxy-Server herstellt.

› Continue reading

Tags: , , , ,