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.
Представьте, что вы просите офисного ассистента распечатать документ 'отчет.pdf'. Инъекция команд происходит, когда кто-то указывает имя 'отчет.pdf; whoami', и ассистент слепо передает всю записку терминалу, заставляя его напечатать отчет и прочесть бейдж администратора.
Web Application SecurityCWE-918.CWE-918CWE-918): Standard Common Weakness Enumeration classification for command-injection-python.Defense-in-DepthПриложение принимает диагностические имена хостов, имена файлов или флаги напрямую из HTTP-запроса пользователя.
Бэкенд формирует строку команды оболочки с помощью склеивания строк вместо использования вектора разделенных аргументов.
Злоумышленник внедряет метасимволы оболочки, такие как ';', '&&', '|' или обратные кавычки (например, '127.0.0.1; id').
Командная оболочка ОС выполняет внедренную команду с привилегиями рабочего процесса веб-сервера.
# 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().