jueves, 20 de febrero de 2014

Client side controls: El problema de confiar la seguridad sobre el cliente

La seguridad sobre los formularios web siempre han sido considerados como un vector válido para llevar a cabo ataques por parte de los ciberdelincuentes. La seguridad de los mismos no debe tomarse a la ligera y es por ello que hoy presentaré uno de los errores típicos de validación de datos de entrada desde el lado del cliente.

En la actualidad es común encontrar sitios web que permiten validar los datos ingresados desde el lado del cliente. Esta actividad es más que válida y además permite reducir considerablemente el tráfico sobre aquellos servidores que realizan las operaciones. Sin embargo, es importante que la seguridad de los datos que serán ingresados en el formulario en cuestión no sean confiados únicamente a la validación de los mismos desde el lado del cliente.

¿Por qué no es suficiente la validación desde el lado del cliente a nivel de seguridad?

Suponiendo que el escenario es el planteado, un atacante podría evadir la validación desde el lado del cliente, pudiendo de esa forma realizar el ataque contra el servidor. Muchos sitios web controlan que no se ingresen caracteres especiales a fin de evitar inyecciones SQL, ataques XSS o similares. Sin embargo, si el atacante evade ese control, podría llevar a cabo el ataque contra el servidor de forma exitosa.

En la siguiente captura, puede observarse el código correspondiente a un formulario con diferentes controles de seguridad desde el lado del cliente.



Si se ingresan datos inválidos, veremos como se ejecuta un alerta e impide el envío de dichos datos al servidor.




Si bien esto parece suficiente en un principio, es posible evadir este tipo de seguridad. Una de las técnicas más utilizadas es a través de un proxy local, por ejemplo utilizando una herramienta como BurpSuite o la ya clásica Paros. De esta manera, es posible ingresar datos válidos y luego interceptar los mismos antes de que sean enviados al servidor. Una vez allí, el atacante podría modificar estos datos para realizar el ataque sobre el servidor.



Si el sitio es vulnerable, incluso es posible realizar un ataque de inyección SQL sobre el mismo. Existen herramientas muy sencillas que podrían facilitar la vida de un atacante para llevar a cabo esta tarea. Una de las más famosas es Sqlmap, donde a través del argumento --data es posible especificar sobre que parámetros debe realizar el ataque de inyección SQL.



Es común que los diseñadores enfoquen la seguridad sobre los controles desde el lado del cliente. El ideal, es implementar codificación segura y contemplar que estos ataques pueden ocurrir aún cuando se implementen controles sobre el lado del cliente utilizando Ajax, JavaScript, o cualquier otra tecnología que lo permita.

¡Recuerden diseñadores y desarrolladores!, la cadena de seguridad puede romperse a través del eslabón más débil. Es por esto que se debe aplicar el mayor nivel de seguridad posible por sobre todas las instancias.

¡Nos vemos pronto!

Fernando Catoira

No hay comentarios.:

Publicar un comentario