flawopen.com/command-injection/Java
Learn how to fix Command Injection (CWE-78) in Java. Side-by-side vulnerable vs secure code examples for ProcessBuilder and Runtime.getRuntime().exec() argument vectors.
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.
// Runtime.exec with string concatenation
public class PingService {
public void ping(String host) throws Exception {
// Attacker input: "127.0.0.1; whoami"
String command = "sh -c ping -c 1 " + host;
Process process = Runtime.getRuntime().exec(command);
}
}
// ProcessBuilder with discrete argument list
public class PingService {
public void ping(String host) throws Exception {
// host is strictly isolated as an argument
List<String> command = List.of("ping", "-c", "1", host);
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
}
}