Inyección de comandos en servidores web

Existen sitios web que permiten al usuario enviar comandos a través de una entrada. Sin embargo, cuando se desarrollan aplicaciones web que permiten la ejecución de algunos comandos, se deben considerar algunos riesgos.

Sin los debidos controles sobre los datos de entrada, podría ejecutarse comandos más de allá de los permitidos por la aplicación web. En estos casos se estaría hablando de vulnerabilidades en control o saneo de parámetros de entrada.

Suponiendo que existe un código fuente para una aplicación web que permitirá ejecutar un ping de forma remota:

Código Fuente

Tal como en otros casos hemos hablado de inyección SQL, en este caso puede apreciarse que la dirección IP del objetivo es tomada directamente a partir del método GET. Por lo tanto, si se realiza un ping con esta aplicación al 127.0.0.1 (localhost), se obtiene una respuesta como la siguiente:

Respuetas ping

Sin embargo, existe un riesgo inherente sobre el archivo php. Como los parámetros no han sido saneados, es posible enviar un comando anidado y ejecutar otro tipo de instrucciones que pueden comprometer al sistema. En la siguiente captura, es posible observar cómo mediante el pipe “|ls /” es posible listar todos los directorios del sistema:

Listado directorio

Asimismo, también es posible reconocer bajo qué usuario se están ejecutando los comandos en el sistema comprometido, mediante la instrucción “whoami”. A continuación se observa una captura con la respuesta:

Whoami

Debido a que se ha probado que es posible ejecutar instrucciones sin restricción sobre el sistema, un atacante podría leer el archivo con las credenciales del mismo. Esto puede observarse en la siguiente captura:

Password

En esta instancia, si el atacante logra obtener las credenciales en texto plano a partir de alguna técnica de cracking, podría tener acceso al sistema de forma remota y comprometer el propio servidor web.

Es importante que los desarrolladores tengan en cuenta este tipo de problemas de seguridad. Lo adecuado en este caso hubiera sido sanear la entrada mediante diferentes comprobaciones para que no sea posible concatenar comandos. Incluso es posible verificar que solo sea factible ingresar direcciones IP válidas mediante algún tipo de comprobación a partir de expresiones regulares, entre otras alternativas.

Si bien este es un simple ejemplo, muchas de las aplicaciones web existentes poseen errores de validación similares al expuesto en este post. De esta manera, es importante realizar revisiones de código así como también el testing sobre las mismas. Por lo tanto, siempre indicamos desde  ESET Latinoamérica que la seguridad debe gestionarse para evitar este tipo de incidentes.

Fernando Catoira
Analista de Seguridad

Autor , ESET

  • Anónimo

    ¡Hola Fernando! Tengo un par de dudas, ¿qué diferencia hay entre el Code Injection y el Command Injection? ¿Y qué instrucciones se usarían en caso de usar el servidor de Microsoft? ¡Gracias!

    • Fernando Catoira

      Estimado usuario:

      La inyección de comandos permite justamente ejecutar instrucciones sobre el sistema objetivo. La inyección de código permite inyectar instrucciones en algún lenguaje para que luego sean ejecutados. En cuanto a tu segunda pregunta, se podrían ejecutar instrucciones para ese sistema de la misma forma que como se demostró sobre Linux pero respetando el set de instrucciones.

      Cualquier otra duda, por favor contáctenos.

      Saludos cordiales,

      Fernando

  • Pingback: ESET Latinoamérica – Laboratorio &...()

  • Pingback: Inyección de comandos en servidores web ...()

Síguenos