Cross-site Scripting (XSS)

Cross-site Scripting (XSS) es un ataque de inyección de código del lado del cliente. El atacante tiene como objetivo ejecutar scripts maliciosos en un navegador web de la víctima mediante la inclusión de código malicioso en una página web o aplicación web legítima. El ataque real ocurre cuando la víctima visita la página web o la aplicación web que ejecuta el código malicioso. La página web o la aplicación web se convierte en un vehículo para entregar el script malicioso al navegador del usuario. Los vehículos vulnerables que se usan comúnmente para ataques de secuencias de comandos entre sitios son foros, tableros de mensajes y páginas web que permiten comentarios.

Una página web o aplicación web es vulnerable a XSS si utiliza una entrada de usuario no higiénica en la salida que genera. Esta entrada del usuario debe ser analizada por el navegador de la víctima. Los ataques XSS son posibles en VBScript, ActiveX, Flash e incluso CSS. Sin embargo, son más comunes en JavaScript, principalmente porque JavaScript es fundamental para la mayoría de las experiencias de navegación

¿No es el Cross-Site Scripting problema del usuario?»

Si un atacante puede abusar de una vulnerabilidad XSS en una página web y ejecutar JavaScript arbitrario en el navegador de un usuario, la seguridad de ese sitio o aplicación web vulnerable  y sus usuarios se verá comprometida. XSS no es un problema del usuario como cualquier otra vulnerabilidad de seguridad. Si afecta a sus usuarios, le afecta a usted.

Los Cross-Site Scripting también se pueden usar para desfigurar un sitio web en lugar de enfocarse en el usuario. El atacante puede usar scripts inyectados para cambiar el contenido del sitio o incluso redirigir el navegador a otra página web, por ejemplo, una que contenga código malicioso.

¿Qué puede hacer el atacante con JavaScript?

Las vulnerabilidades XSS se perciben como menos peligrosas que, por ejemplo, las vulnerabilidades de inyección SQL. Las consecuencias de la capacidad de ejecutar JavaScript en una página web pueden no parecer terribles al principio. La mayoría de los navegadores web ejecutan JavaScript en un entorno muy  controlado. JavaScript tiene acceso limitado al sistema operativo y a los archivos del usuario. Sin embargo, JavaScript puede ser peligroso si se usa incorrectamente como parte del contenido malicioso:

Un JavaScript malicioso tiene acceso a todos los objetos a los que tiene acceso el resto de la página web. Esto incluye el acceso a las cookies del usuario. Las cookies se usan a menudo para almacenar tokens de sesión. Si un atacante puede obtener la cookie de sesión de un usuario, puede hacerse pasar por ese usuario, realizar acciones en nombre del usuario y obtener acceso a los datos confidenciales del usuario.
Un JavaScript puede leer el DOM del navegador y realizar modificaciones arbitrarias. Afortunadamente, esto solo es posible dentro de la página donde se ejecuta el  JavaScript.
Un JavaScript puede usar el objeto XMLHttpRequest para enviar solicitudes HTTP con contenido arbitrario a destinos arbitrarios.
JavaScript en los navegadores modernos puede usar APIs HTML5. Por ejemplo, puede obtener acceso a la geolocalización del usuario, a la cámara web, al micrófono e incluso a archivos específicos del sistema de archivos del usuario. La mayoría de estas APIs requieren la aceptación del usuario, pero el atacante puede usar la ingeniería social para sortear esa limitación.
Lo anterior, en combinación con la ingeniería social, permite a los delincuentes realizar ataques avanzados que incluyen el robo de cookies, la siembra de troyanos, el registro de claves, el phishing y el robo de identidad. Las vulnerabilidades XSS proporcionan el terreno perfecto para escalar los ataques a los más graves. Los Cross-Site Scripting también se pueden usar junto con otros tipos de ataques, por ejemplo, falsificación de solicitudes entre sitios (CSRF).

Existen varios tipos de ataques Cross-Site Scripings : XSS almacenado / persistente, XSS reflejado / no persistente y XSS basado en DOM. Puede leer más sobre ellos en un artículo titulado Tipos de XSS.

Cómo funcionan los Cross-Site Scripting

Hay dos etapas para un ataque XSS típico:

Para ejecutar código JavaScript malicioso en el navegador de una víctima, un atacante primero debe encontrar una manera de inyectar código malicioso (carga útil) en una página web que visita la víctima.
Después de eso, la víctima debe visitar la página web con el código malicioso. Si el ataque está dirigido a víctimas particulares, el atacante puede usar ingeniería social y / o phishing para enviar una URL maliciosa a la víctima.
Para que el primer paso sea posible, el sitio web vulnerable debe incluir directamente la entrada del usuario en sus páginas. Un atacante puede insertar una cadena maliciosa que se utilizará dentro de la página web y que el navegador de la víctima tratará como código fuente. También hay variantes de ataques XSS donde el atacante atrae al usuario a visitar una URL utilizando ingeniería social y la carga útil es parte del enlace en el que el usuario hace clic.