Come le SQL injection modificano l'interazione dell'applicazione Web con il database e gli XSS iniettano codice "eseguibile" nelle pagine HTML, sempre e comunque causa l'imperizia (o la mancanza di tempo) del programmatore che non forzi l'applicazione a validare l'input dell'utente, così i Command Injection Flaws sono vulnerabilità causate dal passaggio di dati non validati a comandi ed eseguibili esterni via exec(), shell_exec(), system(), eccetera.
Con ciò intendo che l'utente sia abilitato ad aggiungere alcuni dati a stringhe di comandi dal programmatore comunque abbozzate e "cablate" nel codice, al fine di completarle:
echo shell_exec("dir ".$_POST['parametri_dir']);
ed escludo che l'utente possa passare intere stringhe di comandi in tal modo:
shell_exec($_POST['exec_cmd']);
Anche il mio gatto - che è una persona seria - perderebbe ogni stima nel programmatore che agisse in questo modo.
In ogni modo, nel caso si debba passare ad un eseguibile comandato dal PHP dati inseriti dall'utente, è assolutamente necessario controllare quanto in input. A tal proposito PHP mette a disposizione due comandi per la validazione degli ingressi, da eseguire su essi prima di passarli alle funzioni dette.
escapeshellcmd
Citando il manuale reperibile su php.net:
Elude ogni carattere di una stringa che potrebbe essere usato per indurre un comando shell ad eseguire codice arbitrario. Questa funzione dovrebbe essere usata per assicurarsi che ogni dato che giunga dall'input dell'utente venga neutralizzato prima di essere passato a funzioni come exec() o system() o all'operatore backtick.
Traducendo: esegue l'escaping dei caratteri che verrebbero interpretati dalla shell: # & ; ` ' " | * ? ~ < > ^ ( ) [ ] { } $ 0x0A 0xFF, ma non esegue il quoting degli argomenti.
escapeshellarg
Citando il manuale reperibile su php.net:
Aggiunge le virgolette attorno ad una stringa ed elude ogni virgoletta semplice per permettere di passare una stringa direttamente ad una funzione shell e che questa venga trattata come un singolo argomento.