OWASP recomienda como defensa contra la inyección de comandos para escapar de todos los caracteres especiales (si no se puede utilizar un enfoque de lista blanca).
Escribí un script PHP rápido haciendo esto:
$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 ;
Sin embargo, si uso '
como entrada, se producirá un error ( Unterminated quoted string
).
No pude evitar el escape de estos caracteres, pero no parece ideal que un atacante pueda generar un error de bash debido a una sintaxis no válida.
¿Hay alguna forma de evitar el escape de estos caracteres especiales?
Sé que sería recomendable usar una lista blanca o mecanismos existentes como escapeshellcmd. Estoy más interesado en la idea general de evitar el escape de caracteres especiales.