Mit der Option register_globals stehen externe URL Parameter direkt im PHP Code als Variable zur Verfügung. Einfach $admin=true setzen und Admin werden?
Die Sicherheitslücke entsteht vor allem durch nicht initialisierte Variablen, die so überschrieben werden können.
Beispiel für aktive register_globals
http://meine_url/mein_skript.php?user=ich
mein_skript.php:
<?php
echo $user; // Ausgabe: ich
?>
Das register_globals Problem
Die Verwendung zeugt vom schlechten Programmierstil. Jeder kann beliebige Variablen im Code erzeugen. Weiterhin fällt im Code die Unterscheidung schwer, zwischen normalen und extern definierten Variablen zu unterscheiden. Eine Sicherheitslücke entsteht insbesondere dann, wenn eine Variable nicht ordentlich initialisiert und extern überschrieben wird.
Beispiel für Entstehung und Ausnutzung von register_globals Sicherheitslücken
if ($user->admin_check() == true)
$admin = true;
if ($admin)
{
echo "Ich bin Admin";
// Do Admin Stuff
}
Hier ist das Problem, das $admin nur gesetzt wird, wenn die Admin Überprüfung erfolgreich war. Ein Aufruf mit http://meine_url/?admin=true würde im Skript $admin auf true setzen und man wäre automatisch Admin, weil keine weitere Variablen Überprüfung stattfindet.
Beispiel für die Vermeidung der Lücke
$admin = false;
if ($user->admin_check() == true)
$admin = true;
if ($admin)
{
echo "Ich bin Admin";
// Do Admin Stuff
}
Im Skript wird die $admin Variable standardmässig mit false initialisiert und bei erfolgreicher Admin Prüfung auf true gesetzt. So besteht keine Möglichkeit den Wert extern zu ändern bzw. dies hat keinen Effekt.
Zum Glück ist register_globals mittlerweile bei den meisten Installationen abgeschaltet. Das PHP Team hat register_globals als deprecated ("veraltet") markiert und wird mit einer der nächsten (Major) Versionen komplett aus PHP verschwinden.
Zur Artikel Übersicht
PHP Sicherheit
Kommentar Verfassen