Richtlinien

Command Injection

Betrachten wir Command Injection zunächst isoliert. Wir konzentrieren uns auf einige verschiedene Beispiele, damit Sie besser nachvollziehen können, wie sich diese Schwachstelle in der Praxis auswirkt. Zur kurzen Auffrischung: Command-Injection-Schwachstellen treten auf, wenn Benutzereingaben Teil eines Betriebssystembefehls werden, wie in der folgenden Funktion:

let ip = request.params.ipAddress;

system("ping " + ip);

Wenn ein Benutzer die IP-Adresse angibt – nehmen wir als Beispiel `8.8.8.8` –, wird der Befehl `ping 8.8.8.8` ausgeführt, was genau dem erwarteten Verhalten entspricht. Wenn der Benutzer jedoch `8.8.8.8 && ls /etc/` eingibt, wird dieser Befehl nicht nur die IP 8.8.8.8 anpingen, sondern zusätzlich `ls` auf den Ordner `/etc/` ausführen.

Risikominderung

Angesichts der Schwere eines Command-Injection-Angriffs sollten Sie sich bei der Arbeit mit Systembefehlen zunächst einige wichtige Fragen stellen:

  • Ist der Aufruf dieses Befehls wirklich erforderlich? Die beste Verteidigung besteht darin, niemals Systembefehle aufzurufen.
  • Gibt es Bibliotheken oder Bindings, mit denen sich dasselbe Ziel ohne Systembefehl erreichen lässt?
  • Können Sie Daten über Standard In an den Prozess übergeben, anstatt sie direkt in den Befehl einzubetten?

Falls dies nicht möglich ist, ist eine Parametrisierung unerlässlich.

Beispiele

Hier sind einige Beispiele in verschiedenen Sprachen, die zeigen, wie dies in der Praxis aussieht.

Ohne Parametrisierung ist dieser Code anfällig für Command Injection.

string folder = "/tmp/ && ifconfig";
string cmd = "\"ls " + folder +"\"";

// UNSICHER: Führt sowohl den `ls`- als auch den `ifconfig`-Befehl aus
System.Diagnostics.Process.Start("bash", "-c " + cmd);

C# - Sicher

Indem der Befehl als Liste von Parametern übergeben wird, erfolgt eine Parametrisierung, die vor Command Injection schützt.

string folder = "/tmp/ && ifconfig";
List<string> arguments = new List<string>() {"-c", "ls", folder};

// SICHER: Führt den ifconfig-Befehl nicht aus
System.Diagnostics.Process.Start("bash", arguments);

Java - Unsicher

Ohne Parametrisierung ist dieser Code anfällig für Command Injection.

String folder = "/tmp/ && ifconfig";

// UNSICHER: Führt sowohl den `ls`- als auch den `ifconfig`-Befehl aus
ProcessBuilder b = new ProcessBuilder("bash -c ls " + folder);

Process p = pb.start();

Java - Sicher

Indem der Befehl als Liste von Parametern übergeben wird, erfolgt eine Parametrisierung, die vor Command Injection schützt.

String folder = "/tmp/ && ifconfig";

// SICHER: Führt den ifconfig-Befehl nicht aus
ProcessBuilder b = new ProcessBuilder("bash", "-c", "ls", folder);

Process p = pb.start();

Javascript – Unsicher

Ohne Parametrisierung ist dieser Code anfällig für Command Injection.

const { exec } = require("child_process");

const folder = "/tmp/ && ifconfig";

// UNSICHER: Führt sowohl den `ls`- als auch den `ifconfig`-Befehl aus 
const ls = exec("bash -c ls " + folder, (error, stdout, stderr) => {
     console.log(`stdout: ${stdout}`);
});

Javascript – Sicher

const { spawn } = require("child_process");

const folder = "/tmp/ && ifconfig";

// SICHER: Führt den ifconfig-Befehl nicht aus
const ls = spawn("bash", ["-c", "ls", folder]);

ls.stdout.on("data", data => {
    console.log(`stdout: ${data}`);
});

Python – Unsicher

Ohne Parametrisierung ist dies anfällig für Command Injection.‍

import subprocess

folder = "/tmp/ && ifconfig"

# UNSICHER: Führt sowohl den `ls`- als auch den `ifconfig`-Befehl aus 
subprocess.run("bash -c ls " + folder, shell=True)

Python – Sicher

Durch die Bereitstellung des Befehls als Parameterliste wird der Befehl parametrisiert und vor Command Injection geschützt.
‍

import subprocess

folder = "/tmp/ && ifconfig"

# SICHER: Führt den ifconfig-Befehl nicht aus
subprocess.run(["bash", "-c", "ls", folder])

‍

Slogan

Sichere Programmierung in der Praxis

Entdecken Sie Richtlinien für sicheres Programmieren, um Schwachstellen wie die OWASP Top 10 zu verstehen und zu beheben, und tauchen Sie in geführte Trainingsmissionen ein, um diese in realistischen Anwendungssimulationen zu üben.

Weitere Richtlinien
Demo buchen