
Befehlsinjektion
Schauen wir uns Command Injection vorerst an. Wir werden uns hauptsächlich auf einige verschiedene Beispiele konzentrieren, damit es einfacher ist, zu sehen, wie es in Aktion aussieht. Zur kurzen Auffrischung: Command Injection-Schwachstellen treten auf, wenn Benutzereingaben einen Teil eines Betriebssystembefehls verwenden, wie z. B. die folgende Funktion:
let ip = request.params.IPAddress;
system („ping" + ip);
Wenn ein Benutzer die IP-Adresse angibt, verwenden wir `8.8.8.8` als Beispiel. Der Befehl, der ausgeführt wird, lautet `ping 8.8.8.8`, was genau das tut, was man erwarten würde. Wenn der Benutzer jedoch `8.8.8.8 && ls /etc/ `angibt, würde dieser Befehl nicht gerade pingt die IP 8.8.8.8 an, aber es wird auch `ls` im Ordner `/etc/ ausgeführt.
Schadensbegrenzung
Angesichts des Schweregrads eines Command-Injection-Angriffs müssen Sie sich bei der Arbeit mit Systembefehlen zunächst einige wichtige Fragen stellen:
- Müssen Sie diesen Befehl wirklich aufrufen? Die beste Verteidigung besteht darin, niemals Systembefehle aufzurufen
- Gibt es Bibliotheken/Bindungen, mit denen Sie den gleichen Effekt ohne Verwendung eines Systembefehls erzielen können?
- Können Sie Daten über Standard In an den Prozess übergeben, anstatt über den Befehl selbst?
Wenn diese Dinge nicht möglich sind, ist die Parametrisierung wichtig.
Beispiele
Hier sind ein paar Beispiele in verschiedenen Sprachen, um zu zeigen, wie das in der Praxis aussieht.
Ohne die Verwendung von Parametrisierung ist dies anfällig für Command Injection.
Zeichenkettenordner = „/tmp/ && ifconfig“;
string cmd = „\" ls "+ Ordner +"\ "“;
//UNSICHER: Führt sowohl den Befehl `ls` als auch den `ifconfig` Befehl aus
System.Diagnostics.Process.Start („bash“, „-c" + cmd);
C# - sicher
Indem der Befehl als Liste von Parametern bereitgestellt wird, wird der Befehl parametrisiert und gegen Command Injection geschützt.
Zeichenkettenordner = „/tmp/ && ifconfig“;
<string>Argumente auflisten = new List <string>() {“ -c“, „ls“, Ordner};
//SECURE: Führt den Befehl ifconfig nicht aus
System.Diagnostics.Process.Start („Bash“, Argumente);
Java - Unsicher
Ohne die Verwendung von Parametrisierung ist dies anfällig für Command Injection.
Zeichenkettenordner = „/tmp/ && ifconfig“;
//UNSICHER: Führt sowohl den Befehl `ls` als auch den `ifconfig` Befehl aus
ProcessBuilder b = neuer ProcessBuilder („bash -c ls" + Ordner);
Prozess p = pb.start ();
Java — Sicher
Indem der Befehl als Liste von Parametern bereitgestellt wird, wird der Befehl parametrisiert und gegen Command Injection geschützt.
Zeichenkettenordner = „/tmp/ && ifconfig“;
//SECURE: Führt den Befehl ifconfig nicht aus
ProcessBuilder b = neuer ProcessBuilder („bash“, „-c“, „ls“, Ordner);
Prozess p = pb.start ();
Javascript - Unsicher
Ohne die Verwendung von Parametrisierung ist dies anfällig für Command Injection.
const {exec} = require („child_process“);
const folder = „/tmp/ && ifconfig“;
//UNSICHER: Führt sowohl den Befehl `ls` als auch den `ifconfig` Befehl aus
const ls = exec („bash -c ls" + Ordner, (Fehler, stdout, stderr) => {
console.log (`stdout: $ {stdout} `);
});
Javascript - Sicher
const {spawn} = require („child_process“);
const folder = „/tmp/ && ifconfig“;
//SECURE: Führt den Befehl ifconfig nicht aus
const ls = spawn („bash“, [“ -c“, „ls“, Ordner]);
ls.stdout.on („Daten“, Daten => {
console.log (`stdout: $ {data} `);
});
Python - Unsicher
Ohne die Verwendung von Parametrisierung ist dies anfällig für Command Injection.
Unterprozess importieren
Ordner = „/tmp/ && ifconfig“
# UNSICHER: Führt sowohl den Befehl `ls` als auch den `ifconfig` Befehl aus
subprocess.run („bash -c ls" + Ordner, shell=TRUE)
Python - Sicher
Indem der Befehl als Liste von Parametern bereitgestellt wird, wird der Befehl parametrisiert und gegen Command Injection geschützt.
Unterprozess importieren
Ordner = „/tmp/ && ifconfig“
# SECURE: Führt den Befehl ifconfig nicht aus
subprocess.run (["bash“, „-c“, „ls“, Ordner])