OWASP raccomanda come difesa contro l'iniezione del comando per sfuggire a tutti i caratteri speciali (se non è possibile utilizzare un approccio di lista bianca).
Ho scritto un rapido script PHP facendo questo:
$input = $_GET['x'];
$dangerous = array("{", "}", "", "(", ")", "<", ">", "&", "*", "|", "=", "?", ";", "[", "]", "$", "–", "~", "!", ".", "%", "/", ":", "+", "'");
$input = str_replace("\","\\",$input);
foreach ($dangerous as $char) {
$input = str_replace($char,"\$char",$input);
}
echo passthru("echo '$input'");
echo "<br><br>executed: " . $input ;
Tuttavia, se utilizzo '
come input, causerà un errore ( Unterminated quoted string
).
Non ero in grado di aggirare l'escape di questi caratteri, ma non sembra ideale che un utente malintenzionato possa generare un errore bash a causa di una sintassi non valida.
C'è un modo per aggirare l'evasione di questi caratteri speciali?
So che si consiglia di utilizzare una whitelist o meccanismi esistenti come escapeshellcmd. Sono più interessato all'idea generale di aggirare l'escape di caratteri speciali.