Según la OWASP los ataques XSS son una de las vulnerabilidades más comunes, las cuales han sido ampliamente utilizadas para llevar a cabo diversos tipos de ataques, pero ¿Realmente se les da la importancia que deberían?.
Los ataques XSS (Cross Site Scripting) tratan de aprovechar vulnerabilidades generadas por una incorrecta validación de datos de entrada en una aplicación web. Básicamente se trata de engañar al usuario para que pulse una URL especialmente manipulada que al abrirse, ejecutará generalmente código Javascript que será interpretado en el navegador del usuario. El código que inyecta el atacante llamará a diversos objetos DOM ( Document Object Model) para ejecutar acciones en el equipo de la víctima; además, para dar un aspecto más amigable a la URL y para evitar ciertos filtros, ésta suele ser transformada mediante acortadores URL o codificada en hexadecimal. Ejemplo:
<script>document.write('<img src="http://inteco.com/img.jpg" />')</script>
%3Cscript%3Edocument.write%28%27%3Cimg%20src %3D%22http%3A%2F%2Finteco.com%2Fimg.jpg%22%20%2F%3E%27%29%3C%2Fscript%3E
Generalmente estos ataques están catalogados como “no persistentes” al ejecutarse en el contexto del navegador sin modificar la página web original. Por otro lado, los conocidos como “persistentes” son más peligrosos ya que el código Javascript es directamente insertado en una base de datos de tal forma que todos los usuarios que visualicen registros de dicha BBDD se verán afectados. Existe gran cantidad de referencias sobre XSS para entender el funcionamiento, tipos y medidas preventivas recomendables para evitar este tipo de problemas.
Hasta ahora, la mayor parte de ataques XSS se centraban en ataques de phishing, robo de cookies, redireccionamientos de URL, defacements, carga de iframes con código malicioso, etc. pero poco a poco van surgiendo técnicas más sofisticadas que van un paso más allá y que hacen valorar en mayor medida la importancia de este tipo de ataques. «Shell of the Future» o «BeFF» son un claro ejemplo de ello.
La idea de «Shell of the Future» es semejante a la empleada por muchos payloads para conseguir una shell remota a través de la cual ejecutar comandos, pero con la diferencia de utilizar el navegador del atacante para navegar con las sesiones HTTP y HTTPS de la víctima por medio de JavaScript.
Para llevar a cabo el ataque es necesario configurar un servidor proxy y un servidor Web. En el servidor web se irán registrando las sesiones de aquellos usuarios que hayan ejecutado la URL maliciosa (o directamente el código Javascript en su navegador) y el atacante podrá interactuar con cualquiera de ellas. Todas las peticiones web que haga el atacante serán modificadas por el proxy, convirtiéndolas en mensajes JSON (JavaScript Object Notation) y enviadas al servidor web, el cual almacenará dichas peticiones en una base de datos a la espera de que la víctima sondee su contenido. La víctima, por medio del JavaScript malicioso sondeará el contenido del servidor web periódicamente en busca de nuevas peticiones y cuando detecte alguna nueva la reenviará al servidor legítimo el cual responderá al usuario y este a su vez al servidor web de nuevo, almacenándola en su base de datos hasta que el servidor proxy la recoja.
Todo esto se llevará a cabo de forma transparente al usuario y permitirá al atacante navegar con las sesiones de la víctima. Por último, el servidor proxy tras encontrar nuevas respuestas en la base de datos del servidor las traerá al navegador del atacante.
El siguiente gráfico muestra un resumen del proceso:
Imagen extraída de blog.andlabs.org
La última versión de este “exploit” (fichero javascript) es mucho más sofisticado ya que evita que las sesiones se corten una vez que el usuario pulse un enlace. Para ello usa el evento onMouseMove situando un enlace oculto debajo del puntero del ratón de tal forma que cualquier enlace que pulse el usuario activará este enlace oculto y abrirá en una nueva pestaña la página deseada por la víctima mientras la sesión anterior continua activa en otra pestaña.
Esta técnica junto con otras realmente complejas como BeFF, las cuales pueden llegar a comprometer un equipo totalmente, son un claro ejemplo de la importancia de mantener un sitio web protegido frente a inyecciones XSS, y del impacto que éste puede llegar a producir. Buenas prácticas de programación y estar al día de los últimos ataques y vulnerabilidades es la mejor receta para prevenir este tipo de ataques.
Para ello, INTECO-CERT cuenta con un servicio de suscripción de vulnerabilidades a través del que es posible conocer los últimos fallos que afectan a determinados productos a través de notificaciones en el correo electrónico. Adicionalmente se pueden realizar búsquedas en el repositorio, con más de 42000 registros, que INTECO-CERT mantiene mediante el “Buscador de vulnerabilidades”.
Fuente: Inteco