Dentro de un lenguaje de programación, ejecuto un comando de shell simple
cd var; echo > create_a_file_here
con var es una variable que contiene una cadena de (con suerte) un directorio al lugar donde quiero crear el archivo "create_a_file_here". Ahora, si alguien ve esta línea de código, es posible explotarla asignando, por ejemplo:
var = "; rm -rf /"
Las cosas pueden ponerse bastante feas. Una forma de evitar el caso anterior sería quizás buscar en la cadena en var algunos caracteres especiales como ';' antes de ejecutar el comando de shell, pero dudo que esto cubra todos los posibles exploits.
¿Alguien sabe una buena manera de asegurarse de que "cd var" solo cambie un directorio y nada más?
sh
o estás creando tu propio lenguaje de programación con una sintaxis similar pero que se expande en var
lugar de requerir que escribas cd "$var"
? ¿O es esto bash
con shopt -s cdable_vars
? Oh, creo que quiere decir que algún otro programa bifurca un shell para ejecutar estos comandos. Así que solo cita var
, pero asegúrate de que no incluya un personaje de cita en sí ...
s='"'; echo "$s"
impresiones "
.
var=untrusted string
en el programa padre, por lo que var
es una variable de entorno que ya está establecida al invocar sh
. Entonces solo necesita citarlo cada vez que lo expande, lo cual es posible de manera confiable. Ah, veo que esa idea ya es parte de la respuesta de Stéphane>. <
var
como argumento. Por ejemplo, llamandosh
con argumentos-c
,'cd "$1"; echo > create_a_file_here'
,'sh'
,var
obras y no necesita ningún cambiovar
. El'sh'
argumento se pasa como$0
.