Original geschrieben von k33n
schon klar, aber wenn jemand dann in seinem cgi-bin
( /wwwroot1/cgi-bin/ ) folgende datei hat:
PHP:
print `less /wwwroot2/login.php`
kann er sich immer noch dateien aus anderen webs anzeigen lassen.
k33n
Das würde bei vernünftiger PHP Konfiguration und PHP Code nicht funktionieren. Einmal gibt es die Möglichkeit mittels doc_root und die weit bessere Möglichkeit über open_basedir dem einen Riegel vorzuschieben. Ebenso würde man im 'login.php' prüfungen vornehmen vor der Ausführung.
Open_basedir beschränkt die Dateien, die von PHP geöffnet werden können, auf Dateien im angegebenen Verzeichnisbaum.
Wenn ein Skript versucht, eine Datei mit z.B. fopen oder gzopen zu öffnen, wird der Ort der Datei überprüft. Wenn sich die Datei außerhalb des spezifizierten Verzeichnisses befindet, was hier der Fall wäre, wird PHP sie nicht öffnen. Alle symbolischen Links sind hier mit eingeschlossen, so dass es auch nicht möglich ist, dieses Verbot mittels symlink zu umgehen.
PHP ist mal ganz allgemein betrachtet schlicht und ergreifend in den meisten Serversystemen implementierten Sicherheitseinstellungen, hinsichtlich der Berechtigungen auf Datei- und Verzeichnisebene, abhängig. Sprich bei schlechter Variablenprüfung z.B. kann man sich große Sicherheitslücken einfangen.
Man sollte daher z.B. eingeschränkte Rechte dem PHP Webuser (sprich der Binärdatei) geben. Ebenso sollte man nichts und niemandem vertrauen und ALLE übertragenen Variablen IMMER prüfen. Man sollte ebenfalls immer nach dem Motto arbeiten das alles was nicht explizit erlaubt wurde automatisch verboten ist.
Bei PHP können beim Kompilieren die Konfigurationsoption --enable-force-cgi-redirect und zur Laufzeit die Konfigurationsdirektiven doc_root und user_dir benutzt werden, um bestimmte Angriffe zu verhindern, falls der Verzeichnisbaum des Servers Verzeichnisse mit Zugriffsbeschränkungen beinhaltet.
Denkbar wäre z.B. Zugriff auf Systemdateien (durch ? in der Abfrageinfo alla
http://host/cgi-bin/php?/etc/passwd) oder Zugriff auf beliebige Web-Dokumente auf dem Server in Form von
http://host/cgi-bin/php/secret/doc.html:
Der Teil der URL-Pfadinformation nach dem Namen der PHP Binärdatei, /secret/doc.html wird im allgemeinen benutzt, um den Namen der Datei zu übergeben, die durch das CGI-Programm geöffnet und interpretiert werden soll.
Normalerweise werden einige Einträge in der Konfigurationsdatei des Webservers benutzt (Apache: Action), um Aufrufe von Dokumenten wie
http://host/secret/script.php3 an den PHP-Interpreter umzuleiten. Bei dieser Konfiguration überprüft der Webserver zuerst die Zugriffsrechte im Verzeichnis /secret und erstellt anschließend den umgeleiteten Aufruf
http://host/cgi-bin/php/secret/script.php.
Unglücklicherweise wird, wenn der Aufruf bereits in dieser Form geschieht, vom Webserver keine Zugriffsüberprüfung der Datei /secret/script.php, sondern lediglich der Datei /cgi-bin/php vorgenommen. So ist jeder Benutzer, der auf /cgi-bin/php zugreifen darf in der Lage, sich zu jedem geschützten Dokument auf dem Webserver Zugriff zu verschaffen.
Mittel und Wege gibt es immer, ist nur eine Frage der Zeit und der zur Verfügung stehenden Mittel. Der beste Schutz ist eine Kombination sämtlicher technischer Möglichkeiten. 100%igen Schutz wird es wohl nie geben....
Gruß Bummibaer