Held-Hintergrund ohne Trennlinie
Richtlinien

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])