In diesem Lab werden Sie das Konzept von Code-Injection-Schwachstellen in Webanwendungen erkunden. Code-Injection ist eine häufige Schwachstelle, die es einem Angreifer ermöglicht, bösartigen Code auf dem Server auszuführen, indem er Code in Benutzereingabefelder injiziert. Das Ziel besteht darin, die Prinzipien hinter Code-Injection-Schwachstellen zu verstehen und zu lernen, wie man sie durch praktische Übungen ausnutzen kann.
Skills Graph
Einrichten der anfälligen Anwendung
In diesem Teil unseres Kurses werden wir eine Webanwendung einrichten, die absichtlich anfällig ist, genauer gesagt, sie hat eine Code-Injection-Schwachstelle. Dies wird uns helfen, zu lernen, wie man solche Probleme identifiziert und bekämpft. So können Sie diese Anwendung starten und lauffähig machen:
Lassen Sie uns diesen Befehl etwas genauer betrachten:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 startet einen neuen Docker-Container mit unserer anfälligen Webanwendung. Das -d-Flag teilt Docker mit, den Container im Hintergrund auszuführen. Der Teil -p 82:80 bildet Port 80 innerhalb des Containers auf Port 82 auf Ihrem Computer ab.
/bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' startet den Apache-Webserver innerhalb des Containers und zeigt dann kontinuierlich das Fehlerprotokoll des Servers an.
docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec ändert die Berechtigungen des Verzeichnisses /var/www/codeexec innerhalb des laufenden Containers, damit die Webanwendung korrekt funktionieren kann.
Sobald der Befehl ausgeführt wurde und der Docker-Container aktiv ist, können Sie mit der Anwendung interagieren, indem Sie Ihren Webbrowser öffnen und zu http://localhost:82/codeexec/example1.php?name=hacker navigieren. Dies bringt Sie zu unserer absichtlich anfälligen Webanwendung. Viel Spaß beim Lernen!
Die Code-Injection-Schwachstelle verstehen
Im vorherigen Schritt haben wir eine Webanwendung eingerichtet, die eine eingebaute Code-Injection-Schwachstelle aufweist. Schauen wir uns genauer den PHP-Code an, der dies möglich macht:
Hier wird die eval()-Funktion in PHP verwendet, um einen String als PHP-Code auszuführen. Das Problem tritt auf, wenn der vom Benutzer übergebene Wert aus dem name-Parameter in der URL direkt in den String eingefügt wird, den eval() ausführt. Da keine Prüfung auf die zulässigen Eingaben erfolgt, wird damit die Tür für Code-Injection-Angriffe geöffnet.
Jetzt lassen Sie uns diese Schwachstelle in Aktion sehen. Wir können unseren eigenen PHP-Code einfügen, indem wir aus dem bestehenden String ausbrechen und unseren eigenen hinzufügen. Versuchen Sie, diese URL zu besuchen:
Sie werden wahrscheinlich eine Fehlermeldung sehen. Dies liegt daran, dass unser eingefügter Code einen Syntaxfehler verursacht hat - wir haben einige doppelte Anführungszeichen unausgeglichen gelassen. Aber keine Sorge, wir können dies beheben, indem wir die Kommentarsyntax von PHP verwenden, um den bestehenden String zu beenden.
Diesmal sollte die phpinfo()-Funktion erfolgreich ausgeführt werden und Informationen über die PHP-Konfiguration des Servers anzeigen. Dies zeigt uns, dass wir die Code-Injection-Schwachstelle erfolgreich ausgenutzt haben. Wie Sie sehen können, können auch kleine Übersehen im Code zu erheblichen Sicherheitsrisiken führen!
Ausnutzung von Code-Injection für die Dateieinbindung
In diesem Schritt werden wir eine gängige Technik zur Ausnutzung von Code-Injection-Schwachstellen erkunden: die Einbindung von Remote-Dateien auf dem Server. Wir werden die file_get_contents()-Funktion von PHP verwenden, um dies zu erreichen.
Hier ist eine Payload, die Sie ausprobieren können, um die Datei /etc/passwd auf dem Server zu lesen:
http://localhost:82/codeexec/example1.php?name=hacker ist die URL unserer anfälligen Anwendung, wie wir es bereits gesehen haben.
%22;var_dump(file_get_contents(%20%27/etc/passwd%27)); ist der Schlüsselteil unserer Payload. Sie verwendet die file_get_contents()-Funktion, um den Inhalt der Datei /etc/passwd zu lesen, und dann var_dump(), um ihn anzuzeigen.
// ist einfach eine Möglichkeit, den Rest des Codes auszukommentieren, damit er nicht mit unserer Payload interferiert.
Die Datei /etc/passwd enthält Informationen über Benutzerkonten auf dem System. Dies kann sehr wertvoll sein, wenn Sie versuchen, ein System weiter auszunutzen. Indem wir diese Payload verwenden, können wir möglicherweise eine Menge nützlicher Informationen erhalten. Versuchen Sie es und sehen Sie, was Sie lernen können!
Schreiben von Dateien auf dem Server
In diesem letzten Teil unseres Labs werden wir eine weitere gängige Ausnutzungstechnik erkunden: das Schreiben von Dateien auf dem Server. Dies kann mit der file_put_contents()-Funktion von PHP erreicht werden. Diese Technik kann besonders nützlich sein, um Web-Shells oder anderen bösartigen Code auf den Server hochzuladen.
Hier ist eine Payload, die Sie ausprobieren können, um eine einfache Web-Shell namens shell.php zu erstellen:
http://localhost:82/codeexec/example1.php?name=hacker ist die URL unserer anfälligen Anwendung, wie zuvor.
%22;var_dump(file_put_contents($_GET[1],$_GET[2])); verwendet die file_put_contents()-Funktion, um eine Datei mit einem Namen, der durch $_GET[1] angegeben wird, und einem Inhalt, der durch $_GET[2] angegeben wird, zu erstellen. Anschließend wird var_dump() verwendet, um das Ergebnis dieser Operation anzuzeigen.
//&1=shell.php&2=<?php system($_GET['cmd'])?> liefert die Argumente für die file_put_contents()-Funktion. shell.php ist der Name der Datei, die wir erstellen, und <?php system($_GET['cmd'])?> ist der Inhalt der Datei. Dieser PHP-Code wird jeden Befehl ausführen, der über den cmd-Parameter in der Abfragezeichenfolge übergeben wird.
Sobald Sie diese Payload ausgeführt haben, sollten Sie in der Lage sein, auf die shell.php-Datei zuzugreifen und Systembefehle auf dem Server auszuführen. Beispielsweise können Sie versuchen, die folgende URL zu besuchen:
http://localhost:82/codeexec/shell.php?cmd=uname -a
Das Ergebnis sieht wie folgt aus:
Dies führt den uname -a-Befehl auf dem Server aus und zeigt die Ausgabe an, wodurch Sie einige grundlegende Informationen über das Betriebssystem des Servers erhalten. Versuchen Sie es und sehen Sie, was Sie lernen können!
Zusammenfassung
In diesem Lab haben Sie über Code-Injection-Schwachstellen gelernt und wie Sie diese mit verschiedenen Techniken ausnutzen können. Sie haben eine anfällige Webanwendung eingerichtet, die zugrunde liegende Schwachstelle verstanden und sie ausgenutzt, indem Sie PHP-Code injiziert haben, um Systembefehle auszuführen, sensible Dateien zu lesen und Dateien auf dem Server zu schreiben. Diese praktische Erfahrung wird Ihnen helfen, die mit Code-Injection-Schwachstellen verbundenen Risiken besser zu verstehen und wie Sie sie in Webanwendungen bekämpfen können.