Command Injection ist eine weit verbreitete Sicherheitslücke. Injection attacks stehen auf der OWASP-Top-Ten-Liste der weltweit anerkannten Sicherheitsrisiken für Webanwendungen an erster Stelle. Dabei ist die Command Injection eine der beliebtesten Arten von Injections.
Eine Command Injection Vulnerabilität ermöglicht es einem Angreifer, beliebige Systembefehle auf dem Host-Betriebssystem (OS) des Angreifers auszuführen. Auf diese Weise können sie den ursprünglichen Befehl außer Kraft setzen, um sich Zugang zu einem System zu verschaffen, vertrauliche Daten zu erlangen oder sogar eine vollständige Übernahme des Anwendungsservers oder Systems durchzuführen.
Einige typische Beispiele für Command Injection Angriffe sind das Einfügen schädlicher Dateien in die Laufzeitumgebung des Servers der anfälligen Anwendung, die Ausführung von Shell-Befehlen und der Missbrauch von Schwachstellen in Konfigurationsdateien.
Die Grundlagen über Schwachstellen bei Command Injections
Ein Command Injection Angriff kann bei Webanwendungen auftreten, die Betriebssystembefehle ausführen, um mit dem Host-Betriebssystem und dem Dateisystem zu interagieren. Das machen sie, um Systembefehle auszuführen, Anwendungen in einer anderen Sprache zu starten oder Shell-, Python-, Perl- oder PHP-Skripte auszuführen. Diese Funktionalität ist zwar Standard, kann aber für Cyberangriffe genutzt werden.
Die Hauptlücke, durch die eine Command Injection ausgeführt werden kann, besteht darin, dass vom Benutzer bereitgestellte Eingaben in Anwendungen nicht validiert werden. Diese Eingaben werden bei der Erstellung von Befehlen verwendet, die dann ausgeführt werden. Solche Cyberangriffe sind möglich, wenn eine Webanwendung die ungeprüften Benutzereingaben (Cookies, Formulare, HTTP-Header usw.) direkt an Betriebssystemfunktionen wie exec() und system() weiterleitet. Die Eingabe ist immer eine Zeichenkette (string cmd), die mit einer konstanten Zeichenkette der Anwendung verknüpft ist, die den vollständigen Befehl darstellt.
Command Injection ist auch als Shell Injection bekannt. Die willkürlichen Befehle, die der Angreifer auf die System-Shell des Webservers, auf dem die Anwendung läuft, anwendet, können alle relevanten Daten gefährden. Die Command Injection kann auch dazu verwendet werden, andere Systeme in der Infrastruktur anzugreifen, die mit dem ursprünglichen System verbunden sind und diesem vertrauen. Auf diese Weise kann der Angreifer die Zugriffsrechte der anvisierten Anwendung nutzen, um eine umfassendere Kontrolle über das System zu erlangen.
Die meisten OS Command Injections sind blinde Sicherheitsrisiken. Das liegt daran, dass die angegriffene Anwendung die Befehlsausgabe nicht in der HTTP-Antwort zurückgibt. Dennoch stellen blind Injections eine Sicherheitsbedrohung dar und können zur Kompromittierung eines Systems verwendet werden.
Command Injection Security Assessment Level

CVSS Vector: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/CR:M/IR:M/AR:M/MAV:N/MAC :L/MPR:N/MUI:N/MS:U/MC:H/MI:H/MA:H
Die Unterschiede zwischen Command Injection und Code Injection
Auch wenn sie ähnlich erscheinen, handelt es sich bei Code Injection und Command Injection um unterschiedliche Arten von Vulnerabilitäten.
Bei der Code Injection fügt ein Angreifer neuen bösartigen Code in eine angreifbare Anwendung ein, der dann ausgeführt wird. Der Angriff basiert auf einer unzureichenden Eingabevalidierung der bösartigen Version der Benutzerdaten. Daher ist die Code Injection Attack auf die Funktionalitäten der angegriffenen Anwendung beschränkt.
Im Gegensatz dazu wird bei einer Command Injection die Standardfunktion der Anwendung, die Systembefehle ausführt, von einem Angreifer geändert. Es wird also kein neuer Code eingefügt. Bei einer Command Injection kann ein Angreifer jedoch den Server oder die Systeme der Anwendung und andere vertrauenswürdige Infrastrukturen angreifen, indem er die Berechtigungen der kompromittierten Anwendung nutzt.
Methoden für die Command Injection
Ein Command Injection Angriff kann durch verschiedene Arten von Schwachstellen erfolgen.
Hier sind einige gängige Beispiele:
- Arbitrary Command Injections: Anwendungen, die es einem böswilligen Benutzer ermöglichen, beliebige Befehle auszuführen, können auf diese Weise angegriffen werden.
- Unsichere Deserialisierung: Die Ausführung der Deserialisierung ohne ordnungsgemäße Eingabevalidierung kann zu Command Injection führen
- XML external entity injection (XXE): Wenn eine Anwendung einen XML-Parser verwendet, der nicht ordnungsgemäß konfiguriert wurde, um die XML-Eingaben des Benutzers zu analysieren, kann dies zu Denial-of-Service-Angriffen, Server-Side Request Forgery (SSRF) und dem Eindringen in anfällige Daten führen.
- Arbitrary file inclusion/upload: Anwendungen, die es Nutzern erlauben, Dateien mit beliebigen Dateierweiterungen hochzuladen, können durch böswillige Befehle beim Einfügen in den Webroot anfällig für Command Injections sein
- Server-side template injection (SSTI): Anwendungen, die Server-side Templates zur Erzeugung dynamischer HTML-Antworten verwenden, können durch das Einfügen schädlicher Server-side Templates verwundbar sein, wenn vom Benutzer bereitgestellte unsichere Daten in eine Vorlage aufgenommen werden.
Beispiele für Command Injection
Böswillige Angreifer können den Ping-Befehl umgehen, indem sie ein Semikolon hinzufügen und beliebige, vom Angreifer bereitgestellte, Betriebssystembefehle ausführen.
<?php
$ip = $_POST['ip'];
$cmd = system('ping '.$ip);
echo $cmd
?>
Example input: ; cat /etc/passwd
Um sicherzustellen, dass Ihre Webanwendung nicht für Command Injection Attacks anfällig ist, müssen Sie alle Benutzereingaben validieren und nur Befehle zulassen, die für die jeweilige Aufgabe erforderlich sind. Sie können auch die Benutzereingaben bereinigen, indem Sie Sonderzeichen wie ; (Semikolon) und andere Shell-Escapes wie &, &&, |, ||, < entfernen.
Wie können Command Injection Attacks verhindert werden
Es gibt bewährte Methoden, um die Situationen einzuschränken, in denen Command Injections in Ihren Systemen ausgeführt werden können.
Hier sind die nützlichsten Tipps zur Anwendung:
- Schränken Sie die Verwendung von Shell-Befehlsfunktionen so weit wie möglich ein
- Verwenden Sie eine vertrauenswürdige API für Benutzereingaben in Ihre Anwendung, insbesondere bei der Ausführung von Systembefehlen wie execFile().
- Validieren Sie Benutzereingaben, die in einen Shell-Ausführungsbefehl einfließen, immer. Das setzt eine solide Strategie zur Überprüfung der Eingaben voraus.
- Filtern Sie potenziell problematische Sonderzeichen, indem Sie eine Erlaubnisliste für Benutzereingaben verwenden oder auf befehlsbezogene Begriffe und Begrenzungszeichen abzielen.
- Kodieren Sie Benutzereingaben, bevor Sie sie in Befehlen verwenden, um zu vermeiden, dass befehlsbezogene Zeichen als Elemente des Befehls oder als Begrenzungszeichen gelesen werden, und um fehlerhafte Eingaben zu vermeiden.
- Parametrisieren Sie Benutzereingaben oder beschränken Sie sie auf bestimmte Datenabschnitte des Befehls, um zu vermeiden, dass die Eingabe als Element des Befehls gelesen wird.
- Stellen Sie sicher, dass Benutzer keine Kontrolle über den Namen einer Anwendung erlangen können, indem Sie execFile() sicher verwenden.
Eine Schwachstelle durch Command Injections besteht, wenn vom Benutzer bereitgestellte Eingaben von der Webanwendung nicht korrekt validiert werden. Das folgende Snippet zeigt PHP-Code, der für Command Injection anfällig ist.
Testen auf Command Injection Vulnerabilitäten
Die Anwendungssicherheit hat oberste Priorität. Daher ist es wichtig, die kritischen Schwachstellen Ihrer Systeme regelmäßig zu überprüfen.
Zur Überprüfung auf blind Command Injections können Sie verschiedene Erkennungstechniken verwenden, wie Verzögerungen, Umleitung der Ausgabe und manuelle Überprüfung der Datei oder Durchführung einer OOB Netzwerkinteraktion mit einem externen Server.
Sie können einige gängige Parameter verwenden, um auf Command Injections im Betriebssystem zu testen:
- cmd
- exec
- command
- execute
- ping
- query
- jump
- code
- reg
- do
- func
- arg
- option
- load
- process
- step
- read
- function
- req
- feature
- exe
- module
- payload
- run
Wenn Sie es vorziehen, automatisiertes Pentesting zu verwenden, anstatt manuell auf gefährliche Software-Schwachstellen zu testen, können Sie ein dynamic application security testing tool verwenden, um Ihre Anwendungen zu überprüfen.
Sie können ganz einfach die Vulnerability Testing Software von Crashtest Security ausprobieren, um Risiken durch Command Injections zu erkennen und potenzielle Angriffe zu verhindern.