Directrices

Inyección de comandos

Analicemos la inyección de comandos por sí sola. Nos centraremos principalmente en varios ejemplos para que sea más fácil ver cómo funciona en la práctica. Como recordatorio rápido, las vulnerabilidades de inyección de comandos ocurren cuando la entrada del usuario se utiliza como parte de un comando del sistema operativo, como en la siguiente función:

let ip = request.params.ipAddress;

system("ping " + ip);

Si un usuario proporciona una dirección IP, usaremos `8.8.8.8` como ejemplo, el comando que se ejecutará será `ping 8.8.8.8`, lo cual hace exactamente lo que uno esperaría. Sin embargo, si el usuario proporciona `8.8.8.8 && ls /etc/`, este comando no solo hará ping a la IP 8.8.8.8, sino que 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 debe hacerse al trabajar con comandos del sistema:

  • ¿Realmente necesita invocar ese comando? La mejor defensa es no invocar nunca comandos del sistema.
  • ¿Existen bibliotecas o enlaces que le permitan lograr el mismo efecto sin usar un comando del sistema?
  • ¿Puede pasar datos al proceso a través de la entrada estándar (Standard In) en lugar de hacerlo mediante el comando en sí?

Si esto no es posible, la parametrización es fundamental.

Ejemplos

A continuación, presentamos algunos ejemplos en varios lenguajes para mostrar cómo se ve esto en la práctica.

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

string folder = "/tmp/ && ifconfig";
string cmd = "\"ls " + folder +"\"";

// INSEGURO: Ejecuta tanto el comando `ls` como el `ifconfig`
System.Diagnostics.Process.Start("bash", "-c " + cmd);

C# - Seguro

Al proporcionar el comando como una lista de parámetros, este queda parametrizado y protegido contra la inyección de comandos.

string folder = "/tmp/ && ifconfig";
List<string> arguments = new List<string>() {"-c", "ls", folder};

// SEGURO: No ejecuta el comando ifconfig
System.Diagnostics.Process.Start("bash", arguments);

Java - Inseguro

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

String folder = "/tmp/ && ifconfig";

// INSEGURO: Ejecuta tanto el comando `ls` como el `ifconfig`
ProcessBuilder b = new ProcessBuilder("bash -c ls " + folder);

Process p = pb.start();

Java - Seguro

Al proporcionar el comando como una lista de parámetros, este queda parametrizado y protegido contra la inyección de comandos.

String folder = "/tmp/ && ifconfig";

// SEGURO: No ejecuta el comando ifconfig
ProcessBuilder b = new ProcessBuilder("bash", "-c", "ls", folder);

Process p = pb.start();

Javascript - Inseguro

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

const { exec } = require("child_process");

const folder = "/tmp/ && ifconfig";

// INSEGURO: Ejecuta tanto el comando `ls` como `ifconfig`
const ls = exec("bash -c ls " + folder, (error, stdout, stderr) => {
     console.log(`stdout: ${stdout}`);
});

Javascript - Seguro

const { spawn } = require("child_process");

const folder = "/tmp/ && ifconfig";

// SEGURO: No ejecuta el comando ifconfig
const ls = spawn("bash", ["-c", "ls", folder]);

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

Python - Inseguro

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

import subprocess

folder = "/tmp/ && ifconfig"

# INSEGURO: Ejecuta tanto el comando `ls` como `ifconfig`
subprocess.run("bash -c ls " + folder, shell=True)

Python - Seguro

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

import subprocess

folder = "/tmp/ && ifconfig"

# SEGURO: No ejecuta el comando ifconfig
subprocess.run(["bash", "-c", "ls", folder])

‍

Eslogan

Programación segura y práctica

Explore las directrices de programación segura para comprender y mitigar vulnerabilidades de software como el OWASP Top 10, y sumérjase en misiones de formación guiada para practicar en simulaciones de aplicaciones del mundo real.

Más directrices
Reservar una demostración