flawopen.com/command-injection/Php
Learn how to fix Command Injection (CWE-78) in PHP. Side-by-side vulnerable vs secure code examples for proc_open(), escapeshellarg(), and shell_exec hazards.
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.
<?php
// shell_exec with string concatenation
$ip = $_GET['ip'];
// Attacker input: "127.0.0.1 && cat /etc/shadow"
$output = shell_exec("ping -c 1 " . $ip);
echo $output;
?>
<?php
// escapeshellarg escapes quotes and metacharacters
$ip = $_GET['ip'];
// Validate format first
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
die("Invalid IP address");
}
// Ensure argument is escaped and isolated
$safe_ip = escapeshellarg($ip);
$output = shell_exec("ping -c 1 " . $safe_ip);
echo htmlspecialchars($output);
?>
escapeshellarg().