OS Command Injection (auch bekannt als Shell Injection) ist eine Web-Sicherheitsanfälligkeit, die es einem Angreifer ermöglicht, beliebige Betriebssystem-Befehle auf dem Server auszuführen, auf dem eine Anwendung ausgeführt wird, und die Anwendung und alle ihre Daten in der Regel vollständig zu kompromittieren.
- Warum müssen Webanwendungen Systembefehle ausführen?
- Warum Sie bei der Verwendung von Systembefehlen in Webanwendungen vorsichtig sein sollten
- Beispiel einer Command Injection-Schwachstelle
- So verhindern Sie Schwachstellen in der Systembefehlsinjektion
- Schwachstellenklassifizierung und Schweregradtabelle
Warum müssen Webanwendungen Systembefehle ausführen?
Webanwendungen müssen manchmal Betriebssystembefehle (OS-Befehle) ausführen, um mit dem zugrunde liegenden Hostbetriebssystem und dem Dateisystem zu kommunizieren. Dies kann zum Ausführen von Systembefehlen, zum Starten von Anwendungen, die in einer anderen Programmiersprache geschrieben wurden, oder zum Ausführen von Shell-, Python-, Perl- oder PHP-Skripten erfolgen. Für jedes Betriebssystem, einschließlich Windows, Unix und Linux, stehen Funktionen zur Verfügung, die einen Befehl ausführen können, der als Shell-Befehl an die anderen Skripte übergeben wird. Diese Funktionalität ist zwar äußerst nützlich, kann jedoch bei falscher Verwendung gefährlich sein und zu Sicherheitsproblemen für Webanwendungen führen, wie in diesem Artikel erläutert.
Warum Sie bei der Verwendung von Systembefehlen in Webanwendungen vorsichtig sein sollten
Durch Ausnutzen einer Command Injection-Sicherheitsanfälligkeit in einer anfälligen Anwendung können Angreifer zusätzliche Befehle hinzufügen oder ihre eigenen Betriebssystembefehle injizieren. Dies bedeutet, dass ein Angreifer während eines Befehlsinjektionsangriffs leicht die vollständige Kontrolle über das Host-Betriebssystem des Webservers übernehmen kann. Daher sollten Entwickler bei der Entwicklung von Webanwendungen sehr vorsichtig sein, wie Benutzereingaben an eine dieser Funktionen übergeben werden.
Beispiel einer Command Injection-Schwachstelle
In diesem Beispiel der Command Injection-Schwachstelle verwenden wir die Ping-Funktionalität, die auf vielen Routern notorisch unsicher ist. Stellen Sie sich eine anfällige Anwendung vor, die über eine gemeinsame Funktion verfügt, die eine IP-Adresse von einer Benutzereingabe an den Ping-Befehl des Systems übergibt. Wenn die Benutzereingabe 127.0.0.1 lautet, wird daher der folgende Befehl auf dem Hostbetriebssystem ausgeführt:
ping -c 5 127.0.0.1
Da es sich um eine anfällige Webanwendung handelt, ist es möglich, aus dem Ping-Befehl auszubrechen oder einen Fehler zu provozieren, der dem Angreifer nützliche Informationen zurückgibt. Der Angreifer kann diese Funktionalität dann verwenden, um seine eigenen willkürlichen Befehle auszuführen. Ein Beispiel für das Hinzufügen zusätzlicher Systembefehle könnte folgendermaßen aussehen:
ping -c 5 127.0.0.1; id
Im obigen Beispiel wird zuerst der Ping-Befehl ausgeführt und direkt danach erfolgt die Ausführung des id-Befehls. Daher sieht die Befehlsausgabe auf der Seite folgendermaßen aus:
Während eines OS Command Injection-Angriffs kann der Angreifer auch einen fehlerbasierten Angriff einrichten. Beispielsweise sieht eine Code-Injektion in diesem Fall normalerweise wie folgt aus:
ping -c 5 "$(id)"
Die obige Code-Injektion gibt eine Antwort wie folgt zurück:
ping: unknown host uid=0(root) gid=0(root) groups=0(root)
So verhindern Sie Schwachstellen in der Systembefehlsinjektion
Um zu verhindern, dass ein Angreifer eine anfällige Webanwendung ausnutzt und Sonderzeichen in den Betriebssystembefehl einfügt, sollten Sie versuchen, Systemaufrufe generell zu vermeiden, bei denen möglich. Vermeiden Sie in jedem Fall Benutzereingaben jeglicher Art, es sei denn, dies ist unbedingt erforderlich. Und wenn es notwendig ist, stellen Sie sicher, dass eine ordnungsgemäße Eingabevalidierung vorhanden ist – die Eingabevalidierung ist immer ein Muss, um sicherzustellen, dass Ihr Webanwendungscode nicht anfällig für andere schwerwiegende Sicherheitsanfälligkeiten ist, einschließlich XSS- und SQL-Injection.
Deaktivieren Sie diese Funktion auch in der Konfigurationsdatei Ihrer Sprache, wenn Sie sie nicht benötigen, damit Angreifer niemals über anfällige Webanwendungen auf die Systemshell des Host-Betriebssystems zugreifen können. In einigen Sprachen können Sie die Ausführung des Prozesses von den Eingabeparametern trennen. Sie können auch eine Whitelist möglicher Eingaben erstellen und die Formate überprüfen, z. B. nur Integer für eine numerische ID akzeptieren.