¿Inyección de comandos cuando se escapan todos los caracteres peligrosos?

1

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.

    
pregunta tim 13.12.2018 - 12:38
fuente

1 respuesta

2

Se me ocurrió un bypass.

Como se mencionó en @Sjoerd, los escapes de barra invertida no funcionan en cadenas entre comillas simples, por lo que es posible salir de la cadena entre comillas simples.

Su lista de caracteres "peligrosos" no incluye backticks o hashes; lo que permite que una carga útil como esta funcione:

' 'hostname' #

O urlencoded:

%27%20%60hostname%60%20%23

La comilla simple se convierte en \' (que se trata como una cotización regular, y '\' se convierte en el primer argumento de echo ), el comando en backticks se ejecuta con el resultado del comando pasado a echo . El hash se trata como un comentario y hace que el shell ignore la comilla simple final, evitando un error de sintaxis.

    
respondido por el Tom Hudson 13.12.2018 - 14:29
fuente

Lea otras preguntas en las etiquetas