previous up contents next


Sicherheitsrelevante Aspekte

PHP wird auf dem Web-Server ausgeführt. Es ist ein mächtiges Werkzeug, das mit Dateien arbeiten, Netzwerkverbindungen öffnen, sowie Systembefehle ausführen kann. Jegliches Programm, das diese Fähigkeiten mitbringt und auf einem Web-Server ausgeführt wird, stellt potentiell ein Sicherheitsrisiko dar.
Laut des PHP-Manual ist PHP, da es speziell auf die Entwicklung von Web-Applikationen ausgerichtet ist, sicherer als andere Sprachen, mit denen Web-basierte Anwendungen programmiert werden (insbesondere auch C und Perl). Im WWW konnten jedoch auch ganz andere Stimmen dazu vernommen werden: ``...applications written in PHP [are] easy to attack and hard to defend''.

  1. globale Variablen und Environment:
    PHP legt für jede Variable, die als Teil des Query Strings oder als Formularfeld übermittelt wird, eine globale Variable an. Hieraus können Sicherheitslücken entstehen, falls Variablen zu Beginn des Skriptes nicht initialisiert werden oder deren Inhalt nicht auf Stimmigkeit hin überprüft wird (z.B. ob eine Variable, die eine Zahl (Integer) enthalten soll, nicht vielleicht doch einen String enthält). Spezielle Vorsicht ist dann geboten, falls solche Variablen in Verbindung mit dem Backtick Operator, einem exec() - Funktionsaufruf oder einer Datenbankabfrage auftreten. Falls einer Variablen $x der Wert rm -f * zugewiesen und dann exec($x) aufgerufen wird, dann könnten einige Dateien verloren sein. Ähnliche Beispiele lassen sich für Datenbankabfragen erstellen, mit denen ein User Datensätze aus einer Tabelle löschen oder verändern kann.
    Also sollten alle Variablen, die man verwenden möchte, initialisiert und geprüft werden. Ebenso sollte mit Environment-Variablen verfahren werden, da sie von PHP ebenfalls automatisch im globalen Namensraum angelegt werden und sich im wesentlichen nicht vom User-Input unterscheiden. Die Möglichkeit ein Sicherheitsloch auszunutzen ist beispielsweise durch folgendes Szenario gegeben: Schafft es ein Angreifer die $PATH-Variable anders zu setzen, so könnte er jeden beliebigen Programmcode auf dem Server zur Ausführung bringen.

  2. Um die Sicherheit des PHP-Systems zu erhöhen wurde der sogenannte Safe-mode eingeführt. Durch diesen werden einige potentielle Sicherheitsrisiken bereits im Vorfeld abgefangen. Siehe dazu [2] Kapitel 4. Dazu gehört die Möglichkeit festzulegen, welche Programme per exec() ausgeführt werden dürfen, das Deaktivieren der File-Upload Funktion und die Unterbindung der Verwendung einiger Funktionen. (siehe auch [2] Chapter 23 für eine exakte Beschreibung des safe_mode).

  3. PHP erlaubt es, daß Dateien über ein HTML-Formular zum Server hochgeladen werden können11. Im Zusammenhang mit diesem Feature kann es zu bedenklichen Sicherheitsrisiken kommen, denn eine Datei wird auf dem Server gespeichert, noch bevor eine Überprüfung stattfindet, ob dieser Upload angenommen werden soll. Zudem wird dann eine globale Variable mit dem Namen des File-Input-Tag des Formulars angelegt, mit dem die Datei übermittelt wurde. Allerdings wird nicht geprüft, ob es sich um einen gültigen Dateinamen - bzw. den Dateinamen einer hocheladenen Datei - handelt. Für einen Angreifer wäre es ein Leichtes, ein eigenes Formular zu erzeugen, und diesem einen gefälschten Dateinamen (z.B. /etc/passwd) mitzugeben. Im folgenden würde dann das PHP-Skript statt mit einer hochgeladenen Datei mit dieser Datei arbeiten (z.B. den Inhalt der Datei in ein öffentlich zugängliches Verzeichnis kopieren). In neueren Versionen von PHP gibt es eine Funktion, die überprüft, ob eine Datei wirklich upgeloadet wurde. (is_uploaded_file(Pfad zur Datei))

  4. Sicherheitsprobleme mit dem Sessionhandling: PHP speichert standardmäßig die Session-Daten im Directory /tmp (siehe auch [*]) und zwar unter der Benutzerkennung des Web-Servers. Auf Web-Servern, die mehrere Domains hosten, kann dies ein Problem darstellen, da ein anderer Domain-Inhaber eine Datei mit demselben User und im selben Verzeichnis anlegen kann. Oder er kann ganz einfach die Dateien im Verzeichnis betrachten. (Und wenn hier die Kreditkartennummer des Kunden der Shopping-Site abgespeichert ist... .)

  5. Die Funktionen include() und require() können mißbraucht werden, um schädlichen Code auszuführen. Falls es einem Angreifer beispielsweise gelingt, per File-Upload eine Datei mit eigenem PHP-Code auf dem Server zu platzieren und dann mittels einer dieser Funktionen sein Skript zur Ausführung bringen kann.

  6. Um Sicherheitsproblemen entgegenzuwirken, die darauf basieren, daß Benutzereingaben an Shell-Kommandos übergeben werden, existieren zwei Funktionen, die in diesem Zusammenhang nützlich sind: EscapeShellCmd() und EscapeShellArg().

  7. Vermeidung von Angriffen, die auf PHP basieren: PHP ist eine funktionsreiche Programmiersprache, wobei es jedoch über weitreichende Konfigurationsoptionen möglich ist, das Verhalten des Systems zu beeinflussen. Es sollte dabei so vorgegangen werden, daß nur die Funktionen aktiv sind, die auch wirklich auf dem System genutzt werden. Die anderen sollten deaktiviert werden.

  8. Bekannte Hacks im Zusammenhang mit PHP:
    1. PHP safe_mode: Under some circumstances, a bug in the PHP mail() function call can be exploited to spawn a shell on the server with the permissions of the user executing the webserver. [5]
    2. PHPLib version 7.2d has been released by the PHPLib Team. This release fixes a vulnerability in prepend.php3 that can be used by an attacker to execute arbitrary PHP code, with the permissions of the user running the Web server. [11]
    3. PHProjekt: PHProjekt, a groupware application written in PHP, has a vulnerability that can be used to read, change, and delete any other user's content. [9]
    4. PHPNuke: SQL exploit [6]
    5. phpMyAdmin: phpMyAdmin is vulnerable to an attack that can be used to execute arbitrary code with the permissions of the user running the Web server. [10]


previous up next
Rene Morschhauser 2002-02-03