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:
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:
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:
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:
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:
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