Plugins und Sicherheit

Gesperrt
Stefan_Br
Beiträge: 36
Registriert: Di 29. Nov 2005, 18:06
Kontaktdaten:

Plugins und Sicherheit

Beitrag von Stefan_Br » Sa 19. Aug 2006, 14:06

Habe viele Plugins, die hier so im Forum kursieren, angeschaut und einige auch in eigenem Gebrauch.
Ich bin sicher alles andere als ein Sicherheitsexperte, aber alle Plugins, die ich hier im Forum gesehen habe, haben so große Sicherheitslücken, dass sogar ich die sofort sehe.

Im Grunde ist jeweils das Hauptproblem, dass es ohne Weiteres möglich ist, die Dateien, die den Plugin-Code enthalten, direkt und somit ohne Anmeldung aufzurufen. Sicher funktionieren viele dann nicht, viele aber schon, erst recht, wenn sie zu Beginn (wie oft gesehen und teilweise unnötig) Dateien aus dem Contenido-Includes-Verzeichnis einbinden und somit auch der Datenbankzugriff etc. zur Verfügung steht.

Teilweise sind die Plugins sogar so gebaut, dass sie dies vorsehen. Das Backup-Plugin von Snoopy zum Beispiel: Es zeigt in der eigentlichen Plugin-Datei lediglich ein Menü an, das dann auf die Dateien, die die eigentliche Arbeit tun, direkt verlinkt. Es ist also lediglich das Menü passwortgeschützt. Jeder kann ohne Anmeldung beliebig in der der Datenbank herumfuhrwerken.

Eine schnelle Lösung und Selbstdisziplinierung ist es, im Plugin-Verzeichnis eine .htaccess-Datei mit folgendem Inhalt anzulegen:

Code: Alles auswählen

Deny from all
Bilder, css-Dateien und Javascripte, die das Plugin braucht, müssen dann in Unterordner, in denen keine php-Dateien liegen und in denen man den Zugriff dann wieder via .htaccess-Datei erlaubt:

Code: Alles auswählen

Allow from all
Plugins, die wie das Backup-Plugin direkt verlinken, funktionieren dann natürlich nicht mehr. Man muss sie dann so umschreiben, dass alle Aufrufe über die main.php von Contenido laufen und dann beispielsweise einen GET-Parameter an den Link hängen, sodass die Plugin-Datei dann weiter verzweigen kann, zum Beispiel so:

Code: Alles auswählen

if($_GET['seite'] == 'seite1.php'){require('./plugins/pluginname/seite1.php');}
Hier bei sollte man nicht so etwas verwenden wie

Code: Alles auswählen

require('./plugins/pluginname/'.$_GET['seite']);
Dies kann nämlich, abhängig vom übergebenem Parameter, beliebigen Code aufrafen, teilweise sogar auch von anderen Servern.
Der Aufruf ist zwar nur für Leute möglich, die in Contenido oder anderen auf dem Server liegenden Skripten angemeldet sind, aber das kann schon gefährlich genug sein.

Mit der .htaccess-Datei-Methode löst man noch gleich ein anderes Problem mit:
Viele Plugins legen im Betrieb sensible Daten in ihrem Verzeichnis ab, die man einfach so runterladen kann. Als Beispiel wieder das Backup-Plugin:
Alle Backups liegen einfach so rum. Jeder kann also den gesamten Inhalt der gesicherten Datenbank inklusive z.B. aller E-Mail-Adressen der Newsletterempfänger runterladen!
Allerdings muss man dann wieder ein bisschen basteln, damit der Download aus dem Plugin heraus bei Verwendung der Zugriffsbeschränkungen noch funktioniert:
Ich habe das z.B. so gelöst:
.htaccess-Datei im Ordner mit den Backups:

Code: Alles auswählen

Allow From All
RewriteEngine on
RewriteRule (.*)$ ../../../main.php?area=backup&frame=4&seite=download_exec.php&%{QUERY_STRING}&datei=$1
Dies sorgt dafür, dass alle Downloadgesuche umgeleitet werden, wobei wieder die Nutzerverwaltung von Contenido für die Sicherheit sorgt, für den Nutzer geht dies völlig transparent, er landet dann bloß, wenn er nicht berechtigt ist, beim Contenido-Login.
Die Datei download_exec.php sieht dann in etwa wie folgt aus:

Code: Alles auswählen

<?php
if(!file_exists('./plugins/backup/backup/'.basename($HTTP_GET_VARS["datei"]))){require('./plugins/backup/download.php'); die();}

header('Content-Type: application/zip');
readfile('./plugins/backup/backup/'.basename($HTTP_GET_VARS["datei"]));

?>
Die Abfrage zu Beginn stellt wieder sicher, dass nichts Falsches runtergeladen wird bzw. dass sich das Ganze vernünftig verhält, wenn die Datei nicht mehr existiert (Umleitung zurück auf das Formular, von dem der Aufruf ausging).

Ansonsten wird mittels readfile einfach die gewünschte Datei ausgegeben.
Der Dateityp wird mittels header lediglich aus Komfortgründen angegeben; ansonsten hält der Browser die Datei für Text oder html und versucht sie anzuzeigen, wenn man den Link einfach anklickt und nicht direkt über das Kontextmenü das Abspeichern anwählt. Gibt man den richtigen Dateityp an, kann der Browser die Datei einfach mit dem richtigen Programm wie gewohnt öffnen.

Den Link auf die Datei muss man dann natürlich mit dem $sess-Objekt erzeugen:

Code: Alles auswählen

<a href="<?php echo htmlentities($sess->url('/plugins/pluginname/downloaddateien/datei.endung')); ?>">Link-Beschreibung</a>
Man kann natürlich auch gleich entsprechend auf die download_exec.php verweisen und sich dann das Rewrite per .htaccess sparen. Dann sollte man aber wiederum den Zugriff auf den Ordner sperren.



Dies bringt natürlich nur auf Servern etwas, die .htaccess-Dateien auswerten!
Im Grunde, und gerade auch für Server, die keine .htaccess-Dateien auswerten, wäre es besser, einen Mechenismus wie z.B. bei phpBB einzuführen, bei dem in den Einstiegsdateien eine Konstante definiert wird (Konstanten können nicht durch Requests gesetzt werden), und in jeder anderen Datei zu Beginn geprüft wird, ob die Konstante gesetzt ist und ansonsten die Ausführung des Skriptes abgebrochen wird.

Dies hier sind nur grundsätzliche Überlegungen. Es ist nicht automatisch jedes Plugin sicher, das sich hiernach richtet! Natürlich muss man weiterhin die üblichen Dinge beachten und zum Beispiel Nutzereingaben prüfen oder Sachen escapen, bevor man sie an die Datenbank schickt!

emergence
Beiträge: 10643
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: Plugins und Sicherheit

Beitrag von emergence » Di 22. Aug 2006, 17:47

Stefan_Br hat geschrieben:...aber alle Plugins, die ich hier im Forum gesehen habe, haben so große Sicherheitslücken
ähm welche genau (abgesehen vom backup plugin) ?
*** make your own tools (wishlist :: thx)

Gesperrt