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.
Imaginez demander à un assistant de bureau d'imprimer un document nommé 'rapport.pdf'. L'injection de commande se produit lorsque quelqu'un fournit le nom 'rapport.pdf; whoami', et l'assistant transmet aveuglément le billet au terminal, imprimant le rapport et lisant le badge d'administrateur.
Web Application SecurityCWE-918.CWE-918Defense-in-DepthL'application reçoit des noms d'hôte de diagnostic ou des noms de fichiers directement à partir d'une requête HTTP.
Le backend assemble une commande shell par simple concaténation de chaînes au lieu d'utiliser un tableau d'arguments isolé.
L'attaquant injecte des métacaractères shell comme ';', '&&', '|' ou des accents graves (ex. '127.0.0.1; id') pour échapper au contexte initial.
Le shell du système d'exploitation exécute la commande injectée avec tous les privilèges du processus du serveur web.
<?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().