Inyección de Comandos
La inyección de comandos ocurre cuando código del lado del servidor, como PHP, en una aplicación web, hace una llamada a una función que interactúa con la consola directamente. Una de estas vulnerabilidades permite al atacante ejecutar comandos en el sistema host.
Una vez que esto pasa, ya puede empezar con la fase de enumeración y pivotar entre sistemas.
Ejemplo de Código
Consideremos el siguiente escenario: MooCorp ha empezado a desarrollar una aplicación basada en web para arte ASCII de vacas con texto personalizable. Buscando maneras de implementar su app, han encontrado el comando cowsay de Linux, que hace justo eso. Así que en vez de programar una aplicación web entera, usan código simple para decirle a cowsay lo que tiene que hacer. Veamos el código que han desarrollado:
<?php if (isset($_GET["mooing"])) { $mooing = $_GET["mooing"]; $cow = 'default'; if(isset($_GET["cow"])) $cow = $_GET["cow"]; passthru("perl /usr/bin/cowsay -f $cow $mooing"); } ?>
En términos simples, este código hace lo siguiente:
-
Comprueba si el parámetro "mooing" está definido. Si lo está, la variable
$mooingrecibe el valor pasado por el parámetro. -
Comprueba si el parámetro "cow" está definido. Si lo está, la variable
$cowtoma lo que le haya sido pasado. -
El programa ejecuta la función
passthru("perl /usr/bin/cowsay -f $cow $mooing);. La funciónpassthru, ejecuta un comando en la consola del sistema operativo. Podemos ver que el comando está concatenando las variables. Ya que podemos manipular esas variables, podemos inyectar comandos usando trucos.
Explotar Inyección de Comandos
Ahora que sabemos cómo funciona la aplicación por dentro, nos aprovecharemos de una capacidad de bash llamada "inline commands".
Para ejecutar comandos inline, sólo necesitamos en el siguiente formato $(nuestro_comando). Si bash detecta un comando inline, lo ejecutará primero y usará el resultado con el comando principal, por ejemplo:

Así que, volviendo a la app de cowsay, esto es lo que pasaría si inyectásemos comandos:

Ya que la aplicación acepta cualquier input por nuestra parte, podemos inyectar comandos inline, que serán ejecutados y usados como parámetro para cowsay. Algunos comandos que puedes probar:
- whoami
- id
- ifconfig / ip addr / ip a
- uname -a
- ps -ef





