💉Command Injection
Command injection es un tipo de vulnerabilidad de seguridad que ocurre cuando un atacante es capaz de inyectar comandos maliciosos en una aplicación o sistema vulnerable a través de inputs.
Nota: Este tipo de técnicas son muy invasivas, ya que vamos a ganar acceso a distintos sistemas, por lo que no podemos utilizar estas técnicas sin un consentimiento o aprobación por parte del objetivo
Introducción a Command Injection
Una vulnerabilidad de inyección de comandos es uno de los tipos de vulnerabilidades más críticos. Nos permite ejecutar comandos del sistema directamente en el servidor de alojamiento back-end, lo que podría poner en riesgo toda la red. Si una aplicación web utiliza una entrada controlada por el usuario para ejecutar un comando del sistema en el servidor back-end para recuperar y devolver un resultado específico, es posible que podamos inyectar una carga maliciosa para subvertir el comando previsto y ejecutar nuestros comandos.
¿Qué son las inyecciones?
Las vulnerabilidades de inyección se consideran el riesgo número 3 en la lista de los 10 principales riesgos de las aplicaciones web de OWASP , dado su alto impacto y lo comunes que son. La inyección ocurre cuando la entrada controlada por el usuario se malinterpreta como parte de la consulta web o el código que se está ejecutando, lo que puede llevar a subvertir el resultado previsto de la consulta a un resultado diferente que sea útil para el atacante.
Existen muchos tipos de inyecciones en las aplicaciones web, según el tipo de consulta web que se esté ejecutando. A continuación, se muestran algunos de los tipos de inyecciones más comunes:
Inyección | Descripción |
Inyección de comandos del sistema operativo | Se produce cuando la entrada del usuario se utiliza directamente como parte de un comando del sistema operativo. |
Inyección de código | Se produce cuando la entrada del usuario se realiza directamente dentro de una función que evalúa el código. |
Inyecciones SQL | Se produce cuando la entrada del usuario se utiliza directamente como parte de una consulta SQL. |
Inyección de HTML/Scripts entre sitios | Se produce cuando se muestra la entrada exacta del usuario en una página web. |
Existen muchos otros tipos de inyecciones además de las mencionadas anteriormente, como LDAP injection
, NoSQL Injection
, HTTP Header Injection
, XPath Injection
, IMAP Injection
, ORM Injection
, y otras. Siempre que se utilice la entrada del usuario dentro de una consulta sin que se haya depurado adecuadamente, es posible escapar de los límites de la cadena de entrada del usuario a la consulta principal y manipularla para cambiar su propósito previsto. Por eso, a medida que se introduzcan más tecnologías web en las aplicaciones web, veremos nuevos tipos de inyecciones introducidas en las aplicaciones web.
Inyecciones de comandos del sistema operativo
Cuando se trata de inyecciones de comandos del sistema operativo, la entrada del usuario que controlamos debe ingresar directa o indirectamente (o afectar de alguna manera) a una consulta web que ejecuta comandos del sistema. Todos los lenguajes de programación web tienen diferentes funciones que permiten al desarrollador ejecutar comandos del sistema operativo directamente en el servidor back-end cuando lo necesite. Esto se puede utilizar para diversos fines, como instalar complementos o ejecutar ciertas aplicaciones.
Ejemplo PHP
Por ejemplo, una aplicación web escrita en PHP
puede usar las funciones exec
, system
, shell_exec
, passthru
o popen
p para ejecutar comandos directamente en el servidor back-end, cada una de las cuales tiene un caso de uso ligeramente diferente. El siguiente código es un ejemplo de código PHP que es vulnerable a inyecciones de comandos:
Quizás una aplicación web en particular tenga una funcionalidad que permita a los usuarios crear un nuevo documento .pdf
que se crea en el directorio /tmp
con un nombre de archivo proporcionado por el usuario y que luego puede ser utilizado por la aplicación web para fines de procesamiento de documentos. Sin embargo, como la entrada del usuario del parámetro filename
en la solicitud GET
se utiliza directamente con el comando touch
(sin ser depurada o escapada primero), la aplicación web se vuelve vulnerable a la inyección de comandos del sistema operativo. Esta falla se puede explotar para ejecutar comandos arbitrarios del sistema en el servidor back-end.
Ejemplo de NodeJS
Esto no es exclusivo de PHP
, sino que puede ocurrir en cualquier marco o lenguaje de desarrollo web. Por ejemplo, si se desarrolla una aplicación web en NodeJS
, un desarrollador puede usar child_process.exec
o child_process.spawn
para el mismo propósito. El siguiente ejemplo realiza una función similar a la que analizamos anteriormente:
El código anterior también es vulnerable a una vulnerabilidad de inyección de comandos, ya que utiliza el parámetro filename
de la solicitud GET
como parte del comando sin sanearlo primero. Tanto las aplicaciones web PHP
como NodeJS
pueden ser explotadas utilizando los mismos métodos de inyección de comandos.
Del mismo modo, otros lenguajes de programación de desarrollo web tienen funciones similares que se utilizan para los mismos fines y, si son vulnerables, se pueden explotar utilizando los mismos métodos de inyección de comandos. Además, las vulnerabilidades de inyección de comandos no son exclusivas de las aplicaciones web, sino que también pueden afectar a otros archivos binarios y clientes pesados si pasan una entrada de usuario no saneada a una función que ejecuta comandos del sistema, que también se pueden explotar con los mismos métodos de inyección de comandos.
En la siguiente sección se analizarán diferentes métodos para detectar y explotar vulnerabilidades de inyección de comandos en aplicaciones web.
Cheatsheet
Operadores de inyección
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) |
Linux
Omisión de caracteres filtrados
Código | Descripción |
| Se puede utilizar para ver todas las variables del entorno. |
Espacios | |
| Usar tabulaciones en lugar de espacios |
| Se reemplazará por un espacio y una tabulación. No se puede utilizar en subcapas (es decir, |
| Las comas serán reemplazadas por espacios. |
Otros caracteres | |
| Será reemplazado por |
| Será reemplazado por |
| Desplazar carácter por uno ( |
Comando de omisión en la lista negra
Código | Descripción |
Inserción de caracteres | |
| El total debe ser par |
| Solo Linux |
Manipulación de casos | |
| Ejecutar comando independientemente de mayúsculas y minúsculas |
| Otra variación de la técnica |
Comandos invertidos | |
| Invertir una cadena |
| Ejecutar comando inverso |
Comandos codificados | |
| Codificar una cadena con base64 |
| Ejecutar cadena codificada b64 |
Windows
Omisión de caracteres filtrados
Código | Descripción |
| Se puede utilizar para ver todas las variables de entorno (PowerShell) |
Espacios | |
| Usar tabulaciones en lugar de espacios |
| Será reemplazado por un espacio - (CMD) |
| Se reemplazará con un espacio - (PowerShell) |
Otros personajes | |
| Será reemplazado por |
| Será reemplazado por |
Comando de omisión en la lista negra
Código | Descripción |
Inserción de caracteres | |
| El total debe ser par |
| Sólo Windows (CMD) |
Manipulación de casos | |
| Simplemente envíe el personaje con mayúsculas y minúsculas impares |
Comandos invertidos | |
| Invertir una cadena |
| Ejecutar comando inverso |
Comandos codificados | |
| Codificar una cadena con base64 |
| Ejecutar cadena codificada b64 |
Última actualización