Saltar a contenido

Introduction

A medida que las aplicaciones web se vuelven más avanzadas y comunes, también aumentan las vulnerabilidades en aplicaciones web. Entre los tipos más comunes de vulnerabilidades están las Cross-Site Scripting (XSS) vulnerabilities. Estas vulnerabilidades aprovechan una falla en la sanitización de entradas del usuario para "escribir" código JavaScript en la página y ejecutarlo en el lado del cliente, lo que conduce a varios tipos de ataques.


What is XSS

Una aplicación web típica funciona recibiendo el código HTML del servidor back-end y renderizándolo en el navegador del cliente. Cuando una aplicación web vulnerable no sanitiza correctamente la entrada del usuario, un usuario malintencionado puede inyectar código JavaScript adicional en un campo de entrada (por ejemplo, comentario/respuesta), de modo que, una vez que otro usuario vea la misma página, ejecute sin saberlo el código JavaScript malicioso.

Las vulnerabilidades XSS se ejecutan exclusivamente en el lado del cliente y, por lo tanto, no afectan directamente al servidor back-end. Solo pueden afectar al usuario que ejecuta la vulnerabilidad. El impacto directo en el servidor back-end puede ser relativamente bajo, pero son muy comunes en las aplicaciones web, lo que equivale a un riesgo medio (low impact + high probability = medium risk), el cual siempre debemos intentar reducir detectando, remediando y previniendo proactivamente este tipo de vulnerabilidades.

xss risk


XSS Attacks

Las vulnerabilidades XSS pueden facilitar una amplia gama de ataques que pueden ejecutarse mediante código JavaScript en el navegador. Un ejemplo básico de un ataque XSS es hacer que el usuario objetivo envíe sin darse cuenta su cookie de sesión al servidor web del atacante. Otro ejemplo es hacer que el navegador del objetivo ejecute llamadas a API que resulten en una acción maliciosa, como cambiar la contraseña del usuario por una elegida por el atacante. Hay muchos otros tipos de ataques XSS, desde minería de Bitcoin hasta la visualización de anuncios.

Dado que los ataques XSS ejecutan código JavaScript dentro del navegador, están limitados al motor de JavaScript del navegador (por ejemplo, V8 en Chrome). No pueden ejecutar código JavaScript a nivel del sistema para realizar algo como la ejecución de código a nivel del sistema. En los navegadores modernos, también están limitados al mismo dominio del sitio web vulnerable. Sin embargo, la capacidad de ejecutar JavaScript en el navegador de un usuario puede conducir a una variedad de ataques, como se mencionó anteriormente. Además, si un investigador con habilidades identifica una vulnerabilidad binaria en un navegador web (por ejemplo, un desbordamiento de Heap en Chrome), puede utilizar una vulnerabilidad XSS para ejecutar un exploit de JavaScript en el navegador del objetivo, lo que finalmente permite salir del sandbox del navegador y ejecutar código en la máquina del usuario.

Las vulnerabilidades XSS pueden encontrarse en casi todas las aplicaciones web modernas y han sido explotadas activamente durante las últimas dos décadas. Un ejemplo bien conocido de XSS es el Samy Worm, un worm basado en navegador que explotó una vulnerabilidad XSS almacenada en el sitio de redes sociales MySpace en 2005. Se ejecutaba al visualizar una página infectada publicando un mensaje en la página de MySpace de la víctima que decía: "Samy is my hero". El mensaje en sí contenía la misma carga útil de JavaScript para volver a publicar el mensaje al ser visto por otros. En un solo día, más de un millón de usuarios de MySpace tuvieron este mensaje en sus páginas. Aunque esta carga útil específica no causó ningún daño real, la vulnerabilidad podría haberse utilizado para fines mucho más dañinos, como robar información de tarjetas de crédito, instalar keyloggers en los navegadores o incluso explotar una vulnerabilidad binaria en los navegadores web de los usuarios (lo cual era más común en los navegadores en esa época).

En 2014, un investigador de seguridad identificó accidentalmente una vulnerabilidad XSS en el panel de control TweetDeck de Twitter. Esta vulnerabilidad fue explotada para crear un tweet auto-retuiteado en Twitter, que llevó al tweet a ser retuiteado más de 38,000 veces en menos de dos minutos. Finalmente, obligó a Twitter a apagar temporalmente TweetDeck mientras parchaban la vulnerabilidad.

Hasta el día de hoy, incluso las aplicaciones web más prominentes tienen vulnerabilidades XSS que pueden ser explotadas. Incluso la página de búsqueda de Google tuvo múltiples vulnerabilidades XSS en su barra de búsqueda, la más reciente fue en 2019 cuando se encontró una vulnerabilidad XSS en la biblioteca XML. Además, Apache Server, el servidor web más utilizado en internet, reportó una vez una vulnerabilidad XSS que estaba siendo explotada activamente para robar contraseñas de usuarios de ciertas compañías. Todo esto nos dice que las vulnerabilidades XSS deben tomarse en serio y se debe dedicar un buen esfuerzo a detectarlas y prevenirlas.


Types of XSS

Existen tres tipos principales de vulnerabilidades XSS:

Tipo Descripción
Stored (Persistent) XSS El tipo más crítico de XSS, que ocurre cuando la entrada del usuario se almacena en la base de datos del back-end y luego se muestra al recuperarla (por ejemplo, publicaciones o comentarios).
Reflected (Non-Persistent) XSS Ocurre cuando la entrada del usuario se muestra en la página después de ser procesada por el servidor back-end, pero sin ser almacenada (por ejemplo, resultados de búsqueda o mensajes de error).
DOM-based XSS Otro tipo de XSS no persistente que ocurre cuando la entrada del usuario se muestra directamente en el navegador y es procesada completamente en el lado del cliente, sin llegar al servidor back-end (por ejemplo, a través de parámetros HTTP del lado del cliente o etiquetas de anclaje).

Cubriremos cada uno de estos tipos en las próximas secciones y realizaremos ejercicios para ver cómo ocurren, y luego también veremos cómo pueden ser utilizados en ataques.