• schlechter Code
• Fehlermeldungen
• besserer Code
• Code kopieren
Fortress ??
• weitere Schmankerl
phpNuke 7.5


Sicherheitslücken in phpNuke 7.5

Beim durchstöbern durch das neue Administrationssystem von phpNuke 7.5 bin ich auf schwere Sicherheitslöcher gestossen.

Alle Module, die den neuen admin-Ordner im Modul-Ordner verwenden, können ohne Adminrechte, fast beliebig manipuliert werden.

Mir war es auf meinem Testsystem durch einfache URL-Manipulation möglich, Downloadkategorien anzulegen, News zu erstellen und User zu löschen. Mehr habe ich noch nicht getestet. Es ist aber mit Sicherheit über den gleichen Weg möglich auch alle anderen Adminfunktionen dieser Module zu steuern.

Von der Installation dieser Version muss deshalb dringend abgeraten werden.

Wie kann das sein?

Sehen wir uns den massgeblichen Code in der Datei /modules/Downloads/admin/index.php an

Zeile Code Sinn? Bemerkung
20 if (!eregi("admin.php", $_SERVER['PHP_SELF'])) { die ("Access Denied"); } es soll verhindert werden, dass diese Datei direkt aufgerufen, oder ausserhalb der admin.php includet wird Diese Überprüfung funktioniert nicht. Man kann dem Check durch geschickte Manipulation der URL vorgaukeln, dass die Zeichenfolge 'admin.php' in der Servervariablen $PHP_SELF vorkommt. Also kann man diese Datei direkt aufrufen oder in eine andere beliebig includen.
21 global $prefix, $db;
22 $aid = substr("$aid", 0,25); der einzige Check, ob die Variable $aid gültig ist Die Variable $aid ist vorher in der Datei nirgends deklariert. Also kann sie beim includen oder direkt aufrufen der Datei mit einem beliebigen Wert über $_REQUEST belegt werden.
23 $row = $db->sql_fetchrow($db->sql_query("SELECT title, admins FROM ".$prefix."_modules WHERE title='Content'")); Alle Admins dieses Moduls aus der Tabelle ermitteln  
24 $row2 = $db->sql_fetchrow($db->sql_query("SELECT name, radminsuper FROM ".$prefix."_authors WHERE aid='$aid'")); prüfen ob ein Admin mit dem Wert der Variablen $aid in der Admintabelle vorhanden ist. Wie bereits beschrieben, kann die Variable $aid theoretisch beliebig belegt werden. Man braucht also nur den Namen des Superadmins der Seite zu wissen. Mit dem gültigen Namen als Bedingung führt diese DB-Anfrage also immer zum Erfolg.
25 $admins = explode(",", $row['admins']);
26 $auth_user = 0; $auth_user mit 0 vorbelegen  
27 for ($i=0; $i < sizeof($admins); $i++) { den mit der Variablen $aid ermittelten Admin überprüfen, ob er auch für das Modul als Admin eingetragen ist.
28     if ($row2['name'] == "$admins[$i]" AND $row['admins'] != "") {
29         $auth_user = 1;     falls ja, $auth_user mit 1 belegen
30     }  
31 }
33 if ($row2['radminsuper'] == 1 || $auth_user == 1) { Wenn der Admin Superadmin ist, oder für das Modul eingetragen ist, alle nachfolgenden Funktionen deklarieren durch die freie Belegung von $aid ist die Bedingung war => Bingo

Ok, was ist zu tun um Adminfiunktionen auszuführen? Nehmen wir als Beispiel den Weg, über den ich auf der Testseite eine Downloadkategorie angelegt habe. Es geht hier um die Datei /modules/Downloads/admin/index.php

Der Weg:

Der normale Weg des includens der Datei über die admin.php bleibt uns versperrt, da wir nicht als Admin angemeldet sind. Da die Datei aber in einem Unterordner des Modulordners liegt können wir dies über die modules.php erledigen. In der modules.php wird nicht ausreichend geprüft, was genau da includet wird. Es werden alle PHP-Dateien includet, solange sie im Ordner "modules" liegen. In dieser Datei befindet sich zwar der Check, ob die Datei innerhalb der admin.php includet ist, aber der lässt sich umgehen (wie, wird hier nicht verraten).

Durch den Weg über die modules.php, wird automatisch auch die mainfile.php includet. In der mainfile werden alle, dem Script übergebenen Parameter, in normale globale Variablen umgewandelt, ohne Unterscheidung ob post, get oder cookie. Und auch völlig egal, ob register_globals on oder off steht. Dadurch kann also die Variable $aid einfach an den URL angehängt werden.

Weiterhin brauchen wir nur noch die anderen für die jeweilige Funktion benötigten Parameter übergeben. Auch hier genügt das einfache Anhängen an den URL, weil in phpNuke nirgends überprüft wird, wie und von wo die Daten ankommen.

Die neue URL sieht dann so aus:

modules.php?name=Downloads&file=adminindex&aid=adminname&op=DownloadsAddCat&title=Hallo&cdescription=irgendwas

Bingo.

Ergebnis: eine neue Downloadkategorie mit Titel "Hallo" und Beschreibung "Irgendwas"

Hinweis

Um es irgendwelchen Script-Kiddies nicht zu leicht zu machen, wurde die URL hier nicht vollständig, richtig wiedergegeben. Es fehlt ein kleiner aber ganz entscheidender Teil.

Weiter?

Die gleiche Methode kann bei folgenden Modulen angewendet werden:

Dies beinhaltet also jeweils hinzufügen, ändern und löschen von Daten




20.09.2004 17:31 © A.Ellsel
Siteadmin @ maaX-dESIGN & pragmaMx & shiba-design