Esto no es una inyección SQL en absoluto; no está pasando $theVar
a un servidor SQL, sino a un comando de shell. Por lo tanto, mysql_real_escape_string
es inútil.
Debes emplear escapeshellarg
, que aplica el mismo concepto a una cadena de shell.
En este ejemplo,
$theVar = preg_replace("/[\"'%()@$.!&?_: #\/-]/","", mysql_real_escape_string($_GET['var']));
exec("zip -r archived.zip ./".$theVar."/");
no está escapando a los caracteres de redirección < y & gt ;. Entonces (por ejemplo) es posible sobrescribir cualquier archivo al que tenga acceso el proceso que ejecuta zip
.
Peor aún, no estás escapando del carácter separador de comando; . Por lo tanto, es posible agregar comandos adicionales (en la medida en que no usen ninguno de los caracteres prohibidos) que también se ejecutarán.
Un mejor enfoque sería ver qué caracteres están permitidos en un nombre de archivo, y solo aceptarlos, rechazar cualquier cadena que contenga caracteres prohibidos. Si permite caracteres comodín (parece que lo hace), expándalos usted mismo con glob()
para obtener una lista de archivos, y verifique que los archivos tengan permisos y ubicaciones al traducir cada ruta a una ruta canónica única usando realpath()
.
Mejor aún, no permitir comodines. En ese momento, también sería fácil verificar si el archivo solicitado sí existe realmente. Los comandos de Shell en su mayoría serían inválidos o inexistentes como nombres de archivos, y serían rechazados automáticamente sin costo adicional.