
Introducción
Los ataques XSS, también llamados ataques por secuencia de comandos, se aprovechan de agujeros de seguridad producidos por una mala configuración en aplicaciones Web, que permiten a terceros ejecutar código, generalmente Javascript, a traves del navegador de la víctima. Se diferencia de otras vulnerabilidades como SQL injections en que no ataca directamente a la aplicación, si no que es el usuario el que está en peligro.
La persona que ejecuta el ataque, no lo dirige hacia un usuario, si no que explota una vulnerabilidad en la web que la víctima visita para que la propia página sea quien ejecuta el código malicioso.
Para entenderlo, un usuario con fines maliciosos descubre un fallo en la configuración del servidor web. Este fallo le permite inyectar código malicioso, por ejemplo, escribiendo dicho código en los típicos formularios para dejar un comentario en una web. La mala configuración permite que el código escrito en el comentario se ejecute a cualquier usuario que acceda a la url.
Este tipo de vulnerabilidad es una de las más comunes y utilizadas en la historia de Internet, la hemos encontrado permanentemente en el top 10 de OWASP.
El código ejecutado normalmente es JavaScript, pero pueden ser VBScript, Java, ActiveX o Flash. Existen determinadas etiquetas HTML que permiten la ejecución de código en páginas webs, como pueden ser: SCRIPT, OBJECT, APPLET o EMBED
Para que el ataque funcione, el navegador de la víctima debe estar configurado para ejecutar el lenguaje del código malicioso. Es normal que muchos usuarios lo tengan activado.
Los objetivos de este ataque son variados, desde obtener la sesión de usuario o redirección a páginas para pishing, hasta infectar el navegador de la víctima, comprometiendo así su sistema. Estos ataques siempre utilizan la ingeniería social aprovechando la confianza de los usuarios en el sitio web vulnerable.
Tipos de XSS
El objetivo de los ataques XSS siempre es ejecutar código en el navegador de la víctima, pero hay diferentes formas de conseguirlo. Por ello, Cross-Site Scripting se puede clasificar en tres categorías:
XSS reflejado: también llamado indirecto, es el tipo más común de XSS. Este tipo de ataque se caracteriza por no almacenar en el servidor el código utilizado. El códido malicioso forma parte de la petición de la víctima que accede a la web. Esta web incluye el código en la respuesta a la petición de la víctima, que se ejecuta en el destino. El proceso de ataque sería:
- El atacante explota un fallo XSS en la web.
- La víctima es engañada por el atacante para entrar en la url maliciosa.
- El sitio web incluye el código malicioso en la respuesta.
- El navegador de la víctima ejecuta el script malicioso, por ejemplo, enviando las cookies de sesión al atacante

XSS persistente: también llamado directo, es una variante más peligrosa de XSS que se basa en la inyección de código malicioso en el contenido almacenado en el servidor de una web o app ajena.
Lo que debemos hacer ahora, es comenzar a caminar por la calle, o si se prefiere en coche para alcanzar una cobertura aún mayor, y la aplicación comenzará a dibujar la ruta que vamos haciendo con todas las redes inalámbricas que detecte.
Ocurre cuando los datos enviados por el atacante se almacenan permanentemente en el servidor y este los muestra a los usuarios en las páginas que visitan como parte de la web. Por ejemplo, un usuario con malas intenciones puede aprovechar una mala configuración en el cuadro para dejar comentarios sobre una foto, por ejemplo, e inyectar código malicioso para mostrar un mensaje en la pantalla, o realizar ataques más elaborados como infectar el navegador de la víctima.
Este tipo de vulnerabilidad es más peligrosa, ya que no se requiere seleccionar un target o atraerlos a un sitio web de terceros, y por ello, el número de víctimas puede ser mucho mayor. La víctima únicamente tiene que visitar la web para ser atacada. A pesar de esto, es menos común encontrarse con este tipo de XSS aunque suelen estar en foros, redes sociales, clientes email web, blogs... A veces se combina con campañas de spam para obtener más efectividad en el ataque.
Las consecuencias pueden ser muchas, permite la ejecución de código, y muchas veces con permisos elevados debido a que muchos usuarios tienen por defecto activada la cuenta de administrador. Por nuestra parte, para defendernos de estos ataques, podemos desactivar JavaScript del navegador, pero a veces es necesario activarlo para interactuar con algunas webs.

DOM XSS: también llamada tipo 0 o DOM-Based XSS, es un ataque más complicado y poco común. Tiene una diferencia esencial con los otros dos tipos cross-site scripting, y es que el código malicioso se inyecta mediante la url pero no se carga como parte de la web en su código fuente, podemos decir que el código no llega a la web, únicamente se ejecuta en el navegador de la víctima.
"Esto nos podría servir de modo que, le demos una URL maligna a alguna víctima que tenga alguna página hospedada en su máquina y, cuando la víctima le da la URL a su navegador el código se ejecuta en su navegador, dicho código podría realizar alguna acción en la página hospedada por la víctima, y como fue ejecutado en el navegador de la víctima también se ejecuta con los permisos que tiene la víctima en su máquina. Esto podría llevar a realizar alguna acción remotamente en la página de la víctima, como si este usuario las hubiera realizado." - XSS a fondo - by Trew
Aquí hay un ejemplo de uso práctico llevado a cabo por un usuario del foro: DOM XSS - Underc0deMedidas de protección
Como usuarios, debemos observar cuidadosamente a las urls a las que accedemos. Podemos optar por desactivar la ejecución de JavaScript en nuestro navegador, aunque esto puede dar problemas con algunos contenidos en determinadas web. Una opción es tener un navegador configurado para esta "navegación segura", algunos aconsejan también usar algún navegador menos común, como Comodo...
Existe una extensión llamada NoScript que ofrece protección frente a ataques XSS, podeís descargarla aquí. Permite configuraciones bastante avanzadas que pueden aportar una seguridad extra cuando navegamos.
Práctica y documentación
Si quereis aprender sobre vulnerabilidades XSS y cómo explotarlas, en la biblioteca de Underc0de tenemos una sección específica con material sobre este tema: XSS - Biblioteca Underc0de
También existen plataformas de aprendizaje para poner en práctica los conocimientos, algunas de las más conocidas son las de Web For Pentesters I y Web For Pentesters II o Damm Vulnerable Web Application (DVWA)
En el foro encontramos tambíen mucha información interesante sobre el tema: