loader image

Cross-Site Scripting o Inyección de código JavaScript

Cross-Site Scripting (XSS) es una vulnerabilidad que permite a un atacante ejecutar código JavaScript en el navegador de una víctima. Para entenderlo mejor, vale verlo como una inyección de código JavaScript en un documento renderizado. Así, constituye una vulnerabilidad enfocada en el lado del cliente y depende del navegador que la víctima esté usando. En consecuencia, no todos los payloads funcionan para todos los objetivos.

Tomemos, por ejemplo, el siguiente código de un tutorial de PHP:

Input sin sanitizar Cross-Site Scripting

El XSS ocurre en este ejemplo porque los parámetros name y age son proporcionados por el usuario y se insertan en el documento renderizado sin antes ser filtrados. Esto permite la inserción de etiquetas HTML que causa la ejecución de código JavaScript en el navegador:

Cross-Site Scripting alert()

Muchas veces, tanto para no levantar sospechas como para evadir posibles mitigaciones, los atacantes pueden codificar el payload en base64:

¿Qué tan peligroso es un Cross-Site Scripting?

JavaScript es uno de los lenguajes de programación más utilizados, inclusive existe una respetable cantidad de malware escrito en este lenguaje, por lo tanto un XSS puede derivar en:

  • Secuestro de información de la sesión del navegador, lo que incluye la sesión misma si las cookies no se encuentran debidamente protegidas.
  • Robo de contraseñas que el usuario almacene en el navegador, las cuales pueden secuestrarse cuando se autocompletan en el navegador.
  • Recolección de información sensible del usuario a través de un keylogger.
  • Uso indebido y no consensuado de los recursos del usuario como, por ejemplo, el minado de criptomonedas para el atacante.
  • Realización de acciones impersonalizando a otro usuario que podría ser uno privilegiado.
  • Desacreditación de la empresa y daño de reputación cambiando la apariencia de la página web con material inapropiado o incluyendo anuncios no deseados.
  • Instar al usuario a instalar malware aprovechándose de la confianza que tiene en la empresa vulnerada.

Tipos de Cross-Site Scripting

Cross-Site Scripting reflejado

Sucede cuando la fuente del código malicioso es una consulta HTTP y este se refleja en la respuesta. La URL es, en específico, en donde se inserta el payload. Una vez que el atacante haya confirmado la existencia de este tipo de XSS, preparará un link con código malicioso que introducirá a través del parámetro vulnerable. Cuando alguien acceda a ese link en el navegador, este realizará una consulta que contendrá el código malicioso en la respuesta y lo ejecutará.

Para poder explotar este tipo de XSS, el atacante debe enviar el link al personal de una empresa (usualmente por email) y esperar a que la víctima haga clic en él.

Flujo Cross-Site Scripting

Cross-Site Scripting persistente

Sucede cuando la fuente de código malicioso se encuentra almacenada en el servidor. En consecuencia, no es necesario enviar ningún tipo de URL pues basta que la víctima revise la página en cuestión para que el payload se ejecute en su navegador.

Si un atacante logra encontrar una sección vulnerable en la página web de una empresa y envía una consulta que contiene código malicioso al servidor, esta será almacenada en la base de datos y ejecutada cada vez que algún usuario acceda a la sección comprometida.

Podemos encontrar este tipo de XSS en secciones de comentarios de foros, feedback, descripciones o chats en vivo, entre otros recursos en donde se almacenen los parámetros que son ingresados por los usuarios.

XSS basado en DOM

Como su nombre lo indica, sucede cuando el código malicioso no se encuentra en la respuesta HTML del servidor de forma explícita, sino que se ubica en el DOM. Es decir, todo ocurre en el navegador:

Esta clasificación tradicional puede llegar a ser confusa debido a que una página podría ser vulnerable a más de un tipo de XSS al mismo tiempo, por lo que también es posible realizar la siguiente clasificación:

Server XSS

Sucede cuando el payload se encuentra en la respuesta HTTP del servidor. Es fácil imaginar escenarios en los que el payload puede introducirse en la URL o podría estar almacenada en el servidor, por lo tanto, ambos tipos de XSS (reflejado y persistente) se traslapan.

Client XSS

Sucede cuando el código malicioso consigue modificar el DOM. Es decir, no se puede detectar el código malicioso en la respuesta HTTP del servidor. Como en le caso anterior, el payload puede introducirse en la URL o podría estar almacenada en el servidor. El tipo XSS basado en DOM es un caso particular de este tipo.

Conclusión

En conclusión, la vulnerabilidad XSS constituye una grave falla en la seguridad de una empresa, puesto que se usa para dañar su reputación directamente a través de un cambio de apariencia, perjudicar a los usuarios, y también para desarrollar un ataque en la que se obtenga acceso no autorizado al sistema de la empresa.

El impacto también dependerá de la creatividad e imaginación del atacante y la omisión de las buenas prácticas de seguridad del personal de la empresa.