Qué es XSS (Cross-Site Scripting)

image En este post, se dará una introducción a lo que es XSS, con la finalidad de entrar en contexto al tema y en próximos post ver ejemplos de estos ataques a nuestro sitio web.

Las siglas XSS se corresponden con el término Cross-Site Scripting, donde se usa la X para no confundirlas con las de CSS (Cascade Style Sheet, Hojas de Estilo en Cascada). La traducción de Cross-Site Scripting podría ser como Ejecución de Código entre Sitios o algo similar. Se puede definir como una amenaza de seguridad que se basa en explotar vulnerabilidades del HTML ubicado en un sitio para inyectar HTML no deseado.

Utilizo la expresión inyectar HTML porque parece que el XSS tiene un denominador común: la construcción dinámica de HTML. Una página web puede ser estática o dinámica. La primera suele ser un archivo con la extensión .html, se escribe una vez y no se modifica habitualmente. En contra las páginas dinámicas varían su contenido cada vez que se visualizan en función de datos que provienen de su exterior, modificaciones que se llevan a cabo usando scripts en el servidor o incluso en el cliente. Esos datos pueden venir del exterior del sitio, a través de formularios por vía POST o GET (portándolos en la URL como parámetros). Si alguno de esos datos es un literal HTML, por ejemplo <script>alert('xss')</script>, cuando este trozo de texto se haga salir a la página se ejecutará el script en el navegador del usuario.

Se suele hacer una clasificación de los tipos de XSS en base a como se construyen dinámicamente los elementos inyectados,

  • No persistente o reflejada: Un usuario envía datos a un sitio a través de un formulario, por ejemplo. El servidor recibe esos datos y genera una página dinámica con un script de servidor usando esos datos. Si los datos contienen algún literal HTML, el script del servidor los inyectará en la página que le devuelve al mismo usuario. Podría parecer que no es un problema que un atacante envíe datos con código para que el servidor le devuelva un HTML inyectado en su propio navegador. Pero usando engaños, un atacante podría llevar a un usuario a través de un vínculo que porta parámetros con HTML inyectado.
  • Persistente o almacenada: En este caso el atacante envía datos con inyección HTML al servidor usando formularios que almacenan los valores recibidos en bases de datos o archivos de texto, por ejemplo. Cuando otros usuarios soliciten consultas a esos datos almacenados y el script del servidor construya la página dinámica, esas inyecciones HTML se ejecutarán. Es evidentemente más peligroso porque afectará a un número mayor de usuarios y durante más tiempo hasta que se arregle el problema.
  • Basada en el DOM o XSS local: En este caso son los scripts del cliente, el JavaScript por ejemplo en el navegador del usuario, el que construye elementos dinámicamente insertándolos en el DOM de la página. Recordemos que el DOM (Document Object Model, Modelo de Objetos del Documento) es un árbol de nodos que construye el navegador del usuario en memoria para estructurar todos los elementos de una página. Con Javascript podemos acceder a ese árbol para insertar un elemento, por ejemplo con
    body.innerHTML += "<script>alert('xss')</script>"

    podemos inyectar un elemento <script> adjuntándolo al resto de elementos del cuerpo de la página. Su código se ejecutará cuando la página se visualice en el navegador del usuario.

Volviendo sobre la terminología empleada, el XSS (Cross-Site Scripting, ejecución de código entre sitios) parece querer reflejar que se trata de una ejecución de código script, principalmente Javascript o Vbscript, que se introduce mediante elementos como <script>. Pero también es posible usar las vulnerabilidades HTML para incrustar otras cosas que parecerían incapaces de producir ejecuciones de script.

Hasta aquí  pura teoría, para conocer un poco acerca del tema, en las próximas entradas veremos unos ejemplos comunes al momento de desarrollar sitios web.

Apoyado en: wextensible.com

Leave a Reply

Your email address will not be published. Required fields are marked *