héroe bg sin separador
Pautas

Inyección de comandos

Veamos Command Injection por sí solo por ahora. Nos centraremos principalmente en algunos ejemplos diferentes para que sea más fácil ver cómo se ve en acción. Como repaso rápido, las vulnerabilidades de la inyección de comandos se producen cuando el usuario utiliza parte de un comando del sistema operativo, como la siguiente función:

let ip = request.params.ipAddress;

sistema («ping" + ip);

Si un usuario proporciona la dirección IP, usaremos 8.8.8.8 como ejemplo, el comando que se ejecutará será ping 8.8.8.8, que hace exactamente lo que cabría esperar. Sin embargo, si el usuario proporciona `8.8.8.8 && ls /etc/ `, este comando no lo haría justo haga ping a la IP 8.8.8.8, pero también ejecutará `ls` en la carpeta `/etc/.

Mitigación

Dada la gravedad de un ataque de inyección de comandos, hay algunas preguntas importantes que debes hacerte primero cuando trabajes con los comandos del sistema:

  • ¿Realmente necesitas invocar ese comando? La mejor defensa es no invocar nunca los comandos del sistema
  • ¿Hay bibliotecas o enlaces que le permitan lograr el mismo efecto sin el uso de un comando del sistema?
  • ¿Se pueden pasar datos al proceso a través de Standard In, en lugar del comando en sí?

Si estas cosas no son posibles, la parametrización es importante.

Ejemplos

Estos son algunos ejemplos en varios idiomas para ayudar a mostrar cómo se ve esto en la práctica.

Sin el uso de la parametrización, es vulnerable a la inyección de comandos.

carpeta de cadenas = «/tmp/ && ifconfig»;
string cmd = «\" ls "+ carpeta +"\ "»;

//INSEGURO: ejecuta los comandos `ls` e `ifconfig`
System.Diagnostics.Process.Start («bash», «-c" + cmd);

C# - seguro

Al proporcionar el comando como una lista de parámetros, el comando se parametriza y se protege contra la inyección de comandos.

carpeta de cadenas = «/tmp/ && ifconfig»;
<string>Argumentos de lista = new List <string>() {» -c», «ls», folder};

//SEGURO: no ejecuta el comando ifconfig
System.Diagnostics.Process.Start («bash», argumentos);

Java: inseguro

Sin el uso de la parametrización, es vulnerable a la inyección de comandos.

Carpeta de cadenas = «/tmp/ && ifconfig»;

//INSEGURO: ejecuta los comandos `ls` e `ifconfig`
ProcessBuilder b = nuevo ProcessBuilder (carpeta «bash -c ls" +);

Proceso p = pb.start ();

Java: seguro

Al proporcionar el comando como una lista de parámetros, el comando se parametriza y se protege contra la inyección de comandos.

Carpeta de cadenas = «/tmp/ && ifconfig»;

//SEGURO: no ejecuta el comando ifconfig
ProcessBuilder b = nuevo ProcessBuilder (carpeta «bash», «-c», «ls»);

Proceso p = pb.start ();

Javascript: inseguro

Sin el uso de la parametrización, es vulnerable a la inyección de comandos.

const {exec} = require («child_process»);

carpeta const = «/tmp/ && ifconfig»;

//INSEGURO: ejecuta los comandos `ls` e `ifconfig`
const ls = exec («bash -c ls» + carpeta, (error, stdout, stderr) => {
console.log (`stdout: $ {stdout} `);
});

Javascript: seguro

const {spawn} = require («child_process»);

carpeta const = «/tmp/ && ifconfig»;

//SEGURO: no ejecuta el comando ifconfig
const ls = spawn («bash», [» -c», «ls», carpeta]);

ls.stdout.on («datos», datos => {
console.log (`stdout: $ {data} `);
});

Python: inseguro

Sin el uso de la parametrización, es vulnerable a la inyección de comandos.

subproceso de importación

carpeta = «/tmp/ && ifconfig»

# INSECURE: ejecuta los comandos `ls` e `ifconfig`
subprocess.run (carpeta «bash -c ls" +, shell = true)

Python: seguro

Al proporcionar el comando como una lista de parámetros, el comando se parametriza y se protege contra la inyección de comandos.

subproceso de importación

carpeta = «/tmp/ && ifconfig»

# SEGURO: no ejecuta el comando ifconfig
subproceso.run (["bash», «-c», «ls», carpeta])