flawopen.com/command-injection/Python
Learn how to fix Command Injection (CWE-78) in Python. Side-by-side vulnerable vs secure code examples for subprocess.run(), shlex.quote(), and os.system avoidance.
Stellen Sie sich vor, Sie bitten einen Assistenten, ein Dokument namens 'bericht.pdf' zu drucken. Eine Befehlsinjektion geschieht, wenn jemand den Dateinamen 'bericht.pdf; whoami' übergibt und der Assistent diesen ganzen Zettel an das Terminal weitergibt, wodurch der Bericht gedruckt und der Administratorenausweis ausgelesen wird.
Web Application SecurityCWE-918 betroffen ist.CWE-918Defense-in-DepthDie Anwendung akzeptiert Hostnamen, Dateinamen oder Diagnoseparameter direkt aus einer HTTP-Anfrage.
Das Backend erstellt den Shell-Befehlsstring durch einfache Zeichenfolgenverkettung statt über ein isoliertes Argumenten-Array.
Der Angreifer fügt Shell-Metazeichen wie ';', '&&', '|' oder Backticks ein (z. B. '127.0.0.1; id'), um den Befehlskontext zu verlassen.
Die Shell des Betriebssystems führt den angehängten Schadcode mit den Rechten des Webserverprozesses aus.
# shell=True spawns /bin/sh to interpret the string
import subprocess
def ping_host(host):
# Attacker input: "8.8.8.8; cat /etc/passwd"
cmd = f"ping -c 1 {host}"
return subprocess.run(cmd, shell=True, capture_output=True)
# shell=False (default): passes arguments directly to the binary
import subprocess
def ping_host(host):
# host is treated strictly as a single argument to ping
cmd = ["ping", "-c", "1", host]
return subprocess.run(cmd, shell=False, capture_output=True, check=True)
shell=False (the default in subprocess).os.system() and os.popen().