xwolf.de|com

Menü

Inhalt dieser Site

Ansicht

Individuelle Benutzerkonfiguration für die Site.

Druckansicht Startseite Suchen

A A A A

PHP 4.1.0 - Die Beseitigung einer Sicherheitslücke

Christian Loth (gidayu.mud.de, chris@gidayu.mud.de), 12.12.2001

Am 10. Dezember war es endlich soweit; PHP nunmehr in der Version 4.1.0 erblickte das Licht der Welt. Diese Skriptsprache erlebte in den letzten Monaten bzw. Jahren einen unglaublichen Popularitätsschub im Zusammenhang sogenannter "data-driven websites": dank der fast schon intuitiv zu nennenden Anbindung an populäre Datenbanksysteme, sowie der nahtlosen Integration in den Apache Webserver, wurde PHP erste Wahl gegenüber den Alternativen ASP oder JSP.

Es lohnt sich wirklich, einmal z.B. auf Freshmeat (http://freshmeat.net) nach PHP Applikationen zu suchen. Fast für jeden Geschmack ist etwas dabei. Von Online-Shops, bis Informations- bzw. Content-Management-Systemen. Alles was das Herz begehrt.

Auch ist PHP von der Syntax und Semantik her leicht erlernbar. Selbst Programmieranfänger haben schon nach kurzer Zeit sichtbare Erfolge was die Motivation und den Hang zum "Draufloshacken" erhöht.

Doch führte die Einfachheit von PHP zu einem anderen fatalen Hang: Blauäugigkeit und Naivität. Viele der PHP-Applikationen arbeiten mit einem Session Management, also ein Usertracking, um die "Bewegung" eines Nutzers durch die PHP Applikation zu verfolgen, bzw. von ihm ausgeführte Aktionen zu protokollieren oder anderweitig Daten zwischenzuspeichern. So wird z.B. in einem Online-Shop System ein Warenkorb mit Waren gefüllt, und tatsächlich der Inhalt dieses Warenkorbs von Seite zu Seite beibehalten.

Viele der PHP Applikationen mit Usermanagement arbeiten mit einem Authentifizierungsmechanismus, ähnlich einem Login auf einer UNIX Maschine. Ist die Authentifikation erfolgreich verlaufen, so könnte man das folgendermassen implementiert haben, z.B. in einem Skript login_is_okay.php:

<CODE>
session_start();
  $authenticated = true;
  session_register("authenticated");
<CODE>

Und auf den nachfolgenden Seiten wäre dann folgendes Codefragment zu finden, z.B. auf der Seite foobar.php:

<CODE>
session_start();
  if ($authenticated == false) {
    session_destroy();
    header("Location: goaway.html");
  }
<CODE>

Um sich die Programmierarbeit zu erleichtern, hat man PHP natürlich mit "register_globals" auf "on" installiert, so dass die Werte aus den serverseitigen Session-Informationen als globale Variablen nutzbar sind. Und da diese Informationen serverseitig gespeichert sind, sind sie auch sicher, da sie vom Nutzer des Systems nicht manipuliert werden können. Alles ist sicher, richtig?

Falsch! PHP vor der Version 4.1.0 hatte drei Möglichkeiten, einem PHP Skript globale Variablen mitzuteilen. Einmal durch die Session-Informationen, dann durch HTTP-POST, und durch HTTP-GET. Unglücklicherweise scheinen die Werte aus z.B. HTTP_GET Präferenz gegenüber den Werten aus den Session-Informationen zu haben.

Was bedeutet dies? Um es kurz zu sagen: dies ist ein Sicherheitsloch, ein Brecheisen für alle blauäugig programmierten PHP Applikationen. Durch diese Präferenz bei globalen Variablen könnte man z.B. das obige Beispiel von foobar aushebeln durch: foobar?authenticated=1, und schon würde man an den Inhalt von foobar.php kommen, ohne sich authentifiziert zu haben. Alles was ein Angreifer benötigt, um solche Variablen zu manipulieren, ist der Name dieser Variablen. Gerade bei Open Source PHP Applikationen ist dies natürlich fatal. Und selbst Closed Source Systeme sind nicht sicher: man kommt an Variablen durch Überprüfung von HTTP-GET Übergaben a la "<A HREF="foobar.php?val1=2">Link</A>", oder einfach durch Raten. Da Variablen häufig nach ihrem Kontext benannt werden, ist dies auch nicht wirklich schwer, z.B. "authenticated", "auth", "login", etc.

Mit dieser Schwäche räumt nun PHP 4.1.0 radikal auf, aber zu einem grossen Preis. Es wurde schlichtweg der Eingabemechanismus für globale Variablen komplett neu eingebunden (natürlich ist PHP 4.1.0 abwärtskompatibel, jedoch wird vom Gebrauch der alten Funktionalität abgeraten). Nunmehr gibt es die global sichtbaren assoziativen Arrays $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, und $_SESSION. Die Schlüssel dieser Arrays sind jeweils die Variablennamen, die Werte gleichermassen die Werte der Variablen. Die Arrays haben jeweils folgenden Inhalt:

$_GET Variablen aus einem HTTP-GET
$_POST Variablen aus einem HTTP-POST
$_COOKIE Informationen aus einem Cookie
$_SERVER Variablen die vom Webserver übergeben werden (z.B. "REMOTE_ADDR")
$_ENV Umgebungsvariablen
$_REQUEST Alle nichtvertraulichen Informationen (da Nutzermanipulierbar). Dies entspricht einer Zusammenlegung von $_GET, $_POST, und $_COOKIE
$_SESSION Session-Informationen

Dieses neue Eingabesystem von PHP 4.1.0 ermöglicht natürlich eine größere Sicherheit von PHP Applikationen. Der Preis jedoch ist, daß sämtliche bereits bestehende Applikationen dementsprechend umgeschrieben werden müssen. Dies kann je nach Applikation ein nicht unnerheblicher Arbeitsaufwand sein.

So besteht eine Applikation des Authors aus ca. dreissig PHP Skripten, und das Mailaufkommen der dem Projekt zugehörigen Mailingliste für CVS Meldungen war enorm.

Um das obige Beispiel für login_is_okay.php bzw. foobar.php zu nehmen, so müsste für diese beiden Codefragmente die Beseitigung der Sicherheitslücke aussehen:

login_is_okay_fixed.php:
<CODE>
session_start();
  $_SESSION["authenticated"] = true;
<CODE>

foobar_fixed.php:
<CODE>
session_start();
  if ($_SESSION["authenticated"] == false) {
    session_destroy();
    header("Location: goaway.html");
  }
<CODE>

Sollten Sie demnächst am frühen Morgen durch ein lautes Rattern, Klackern oder Knacken geweckt werden, so ist dies kein sich ankündigendes Erdbeben. Dies ist die Malträtierung der Tastaturen von PHP Entwicklern, die nun einsehen müssen, daß Webprogrammierung in PHP doch nicht so einfach ist, wie es zunächst den Anschein hatte.

Referenzen

Der Autor

Christian Loth ist Student der Informatik, und leidentschaftlicher Linux/Unix Programmierer. Zu seinen Projekten gehörten einst das MUD "Realm of Magic", und nun das MUD "Gidayu", und das ACME System (ACounting Management Environment) zum Managen von Netzwerken in den Duisburger Studentenwohnheimen, mit IP Accounting und automatischen Sperrmechanismen.



Punkte: - (unbewertet), Stimmen: 0 Abstimmen:

Info

$Id: php410.shtml,v 1.3 2004/03/08 22:09:09 xwolf Exp $
© 1996 - 2004 by xwolf - xwolf ist eingetragene Marke beim Deutschen Patent- und Markenamt (Nr. 301 04 380)