Kommandozeilenzugriff vom Browser mit shell.php
On Januar 5, 2022 by adminManchmal möchte man vom Browser aus auf die Shell zugreifen. Dies kann mit PHP erreicht werden, wenn die Sicherheitseinstellungen dies zulassen. Ich habe diese Funktionalität in shell.php implementiert (verfügbar auf Github). Im obigen Screenshot sehen Sie, wie der Shell-Zugriff über einen Browser funktioniert. Das Skript ermöglicht das Hochladen, Herunterladen, Anzeigen, Bearbeiten und Entfernen einer Datei, das Zippen und Entpacken eines Verzeichnisses und das Durchsuchen der Verzeichnisse auf dem Server mit der Maus, aber Sie können auch benutzerdefinierte Befehle über die Tastatur eingeben.
Sicherheitswarnung und Haftungsausschluss
Bitte führen Sie dieses Skript nur auf Rechnern aus, die Ihnen gehören (oder während eines autorisierten Pests). Vergewissern Sie sich außerdem, dass der Rechner über eine ordnungsgemäße Firewall verfügt (Port 80 sollte nicht aus dem Internet erreichbar sein). Verwenden Sie es nicht für bösartige Zwecke! Lesen Sie hier mehr über den Missbrauch von Shell-Skripten.
Bekannte Probleme
Wenn das Skript nicht funktioniert, kann es daran liegen, dass die PHP-„Passthru“-Funktion, auf die es sich stützt, deaktiviert ist. Um die deaktivierten PHP-Funktionen aufzulisten, führen Sie den folgenden PHP-Code aus:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Auf einem sofort einsatzbereiten Ubuntu 14.04 ergibt das folgende Ausgabe:
bool(false)Array( => pcntl_alarm => pcntl_fork => pcntl_waitpid => pcntl_wait => pcntl_wifexited => pcntl_wifstopped => pcntl_wifsignaled => pcntl_wexitstatus => pcntl_wtermsig => pcntl_wstopsig => pcntl_signal => pcntl_signal_dispatch => pcntl_get_last_error => pcntl_strerror => pcntl_sigprocmask => pcntl_sigwaitinfo => pcntl_sigtimedwait => pcntl_exec => pcntl_getpriority => pcntl_setpriority =>)Array( =>)
PHP-Shell-Ausführungsbefehle
Wenn das Skript mit passthru()
nicht ausgeführt werden kann, versucht es einige andere Befehle. Die folgenden Befehle sind ähnlich:
-
exec()
Gibt die letzte Zeile der Befehlsausgabe zurück -
passthru()
Gibt die Befehlsausgabe direkt an den Browser weiter -
system()
Gibt die Befehlsausgabe direkt an den Browser weiter und gibt die letzte Zeile zurück -
shell_exec()
Gibt die Befehlsausgabe zurück -
popen()
Öffnet eine Lese- oder Schreib-Pipe zur Verarbeitung eines Befehls -
proc_open()
Ähnlich wie popen(), aber mit mehr Kontrolle -
pcntl_exec()
Führt ein Programm aus
Härtet Ihren Server mit open_basedir
Wenn Ihnen das obige Skript unheimlich erscheint, dann möchten Sie vielleicht verhindern, dass es auf Ihrem Server ausgeführt wird. Sie können dies tun, indem Sie den abgesicherten Modus aktivieren (veraltet), die php.ini-Variable „disable_functions“ und/oder die Suhosin-Funktionsausführungs-Blacklist verwenden.
Ich habe einen gut geschriebenen Beitrag über die Absicherung Ihrer PHP-Installation gefunden, sehen Sie ihn sich an! Neben der Einschränkung der ausführbaren Funktionen empfehlen sie auch die „open_basedir“ php.ini Konfigurationsvariable. Sie schränkt die Dateien, auf die PHP zugreifen kann, auf den angegebenen Verzeichnisbaum ein. Ich glaube, dass dies ein mächtiges Werkzeug ist.
Auch könnte es eine gute Idee sein, Ihr „/tmp“-Verzeichnis mit „nodev“, „nosuid“ und „noexec“-Flag zu sichern, wie hier beschrieben.
Kannst du Suhosin nicht finden?
Bitte beachte, dass das „php5-suhosin“-Paket (eine PHP-Sicherheitserweiterung) auf Debian-basierten Systemen nicht mehr installiert und verfügbar ist. Einige der Sicherheitsverbesserungen wurden in die neuesten PHP-Versionen (5.4 und 5.5) integriert. Wenn Sie Suhosin (von Github) auf Ubuntu 14.04 (PHP 5.5.9) installieren möchten, können Sie dieser Anleitung folgen.
Sie können mehr über die Kontroverse um die Entfernung von Suhosin auf LWN.net lesen.
Privilegientrennung
Wenn es mehrere Benutzer auf dem System gibt, ist „Privilegientrennung“ ein MUSS. Das bedeutet, den PHP-Code im Benutzerkontext auszuführen (z.B. als Benutzer „maurits“) und nicht als Benutzer „www-data“. Ich habe einen tollen Artikel gefunden, der erklärt, wie dies erreicht werden kann. Die einfachste Lösung ist die Ausführung von:
sudo apt-get install libapache2-mpm-itk
Und dann das Hinzufügen der Direktive „AssignUserID“ zu jeder „VirtualHost“-Konfiguration. Beachten Sie, dass dies vielleicht nicht die sicherste Lösung ist, aber sie funktioniert gut und ist einfach zu installieren.
Fazit
Sie sollten PHP immer auf die neueste Version aktualisieren und patchen, um die Ausnutzung bekannter Sicherheitslücken zu verhindern. Tools wie „disable_functions“, „open_basedir“, Suhosin und Filesystem Flags reduzieren die Angriffsfläche und verhindern das Ausnutzen von unbekannten Sicherheitslücken. Mit ihnen können Sie eine mehrschichtige Sicherheitsstrategie umsetzen. Vergessen Sie auch nicht die Privilegientrennung.
Schreibe einen Kommentar