💉Detección
Última actualización
Última actualización
El proceso de detección de vulnerabilidades básicas de inyección de comandos del sistema operativo es el mismo proceso para explotar dichas vulnerabilidades. Intentamos agregar nuestro comando a través de varios métodos de inyección. Si el resultado del comando cambia con respecto al resultado habitual previsto, hemos explotado la vulnerabilidad con éxito.
Esto puede no ser cierto para vulnerabilidades de inyección de comandos más avanzadas porque podemos utilizar varios métodos de fuzzing o revisiones de código para identificar posibles vulnerabilidades de inyección de comandos. Luego, podemos construir gradualmente nuestra carga útil hasta lograr la inyección de comandos.
Este módulo se centrará en las inyecciones de comandos básicas, donde controlamos la entrada del usuario que se usa directamente en una función de ejecución de comando del sistema sin ningún tipo de desinfección.
Para demostrarlo, utilizaremos el ejercicio que se encuentra al final de esta sección.
Cuando visitamos la aplicación web en el siguiente ejercicio, vemos una utilidad Host Checker
que parece pedirnos una IP para comprobar si está viva o no:
Podemos intentar ingresar la IP del host local 127.0.0.1
para verificar la funcionalidad y, como se esperaba, devuelve la salida del comando ping
que nos dice que el host local está efectivamente activo:
Aunque no tenemos acceso al código fuente de la aplicación web, podemos suponer con seguridad que la IP que ingresamos va a un comando ping
ya que el resultado que recibimos así lo sugiere. Como el resultado muestra un solo paquete transmitido en el comando ping, el comando utilizado puede ser el siguiente:
Si no se desinfecta ni se escapa nuestra entrada antes de usarla con el comando ping
, es posible que podamos inyectar otro comando arbitrario. Por lo tanto, intentemos ver si la aplicación web es vulnerable a la inyección de comandos del sistema operativo.
Para inyectar un comando adicional al deseado, podemos utilizar cualquiera de los siguientes operadores:
Operador de inyección | Carácter de inyección | Carácter codificado en URL | Comando ejecutado |
Punto y coma |
|
| Ambos |
Nueva linea |
| Ambos | |
Background |
|
| Ambos (la segunda salida generalmente se muestra primero) |
Pipe |
|
| Ambos (solo se muestra la segunda salida) |
AND |
|
| Ambos (solo si el primero tiene éxito) |
OR |
|
| Segundo (solo si falla el primero) |
Sub-Shell |
|
| Ambos (solo Linux) |
Sub-Shell |
|
| Ambos (solo Linux) |
Podemos usar cualquiera de estos operadores para inyectar otro comando para que se ejecuten ambos o cualquiera de los comandos. Escribiríamos nuestra entrada esperada (por ejemplo, una IP), luego usaríamos cualquiera de los operadores anteriores y luego escribiríamos nuestro nuevo comando.
Consejo: Además de lo anterior, hay algunos operadores exclusivos de Unix que funcionarían en Linux y macOS, pero no en Windows, como envolver nuestro comando inyectado con comillas dobles invertidas ( ``
) o con un operador de sub-shell ( $()
).
En general, para la inyección de comandos básicos, todos estos operadores se pueden utilizar para inyecciones de comandos independientemente del lenguaje de la aplicación web, el marco o el servidor back-end. Entonces, si estamos inyectando una aplicación web PHP que se ejecuta en un servidor Linux, o una aplicación web .Net que se ejecuta en un servidor back-end de Windows, o una aplicación web NodeJS que se ejecuta en un servidor back-end de macOS, nuestras inyecciones deberían funcionar. a pesar de todo.
Nota: La única excepción puede ser el punto y coma ;
, que no funcionará si el comando se ejecuta con Windows Command Line (CMD)
, pero sí funcionará si se ejecuta con Windows PowerShell
.
En la siguiente sección, intentaremos utilizar uno de los operadores de inyección anteriores para explotar el ejercicio Host Checker
.
Intente agregar cualquiera de los operadores de inyección después de la dirección IP en el campo IP. ¿Qué decía el mensaje de error (en inglés)?