Uno de los tipos más comunes de vulnerabilidades en los sitios web se llama «Cross-Site Scripting» o «XSS». En el caso de vulnerabilidades XSS, un usuario puede iniciar la ejecución de JavaScript. Hay diferentes versiones de la vulnerabilidad XSS con distintos grados de gravedad.
El problema con un atacante que podría ejecutar JavaScript en las sesiones de otros usuarios es que el atacante podría hacer cualquier cosa en el sitio web que ven las víctimas. Esto incluye redirigir a las víctimas a sitios web externos, robar tokens de autenticación y monitorear los detalles de pago.
La forma más grave de la vulnerabilidad XSS es la secuencia de comandos entre sitios «almacenada» o «persistente». Aquí, un atacante podría crear una carga útil XSS y luego enviarla para que se almacene en la base de datos. Con un exploit XSS almacenado en la base de datos, otros usuarios pueden verse influenciados durante un período de tiempo más largo.
Otra forma de secuencia de comandos entre sitios se «refleja». Este tipo nunca se guarda. En cambio, la carga útil se absorbe en el navegador. Normalmente, este tipo de XSS es parte de los ataques de phishing, en los que un atacante intenta engañar a una víctima para que haga clic en un enlace malicioso.
En general, la mayoría de los ataques XSS envían la carga útil al servidor en algún momento. Sin embargo, algunos ataques son puramente del lado del cliente, nunca se envían al servidor y, en cambio, solo afectan a JavaScript del lado del cliente. Esto se conoce como XSS basado en DOM porque permanece en el Modelo de objetos de documento (DOM) de JavaScript. Este tipo de vulnerabilidad es particularmente difícil de identificar y corregir porque el servidor nunca detecta las vulnerabilidades y, por lo tanto, no se pueden registrar.
En el pasado, la técnica de prevención contra las vulnerabilidades XSS consistía en filtrar todos los datos enviados por el usuario y utilizar listas negras para rechazar mensajes con caracteres o palabras significativas en JavaScript. Esto tendía a conducir a una carrera armamentista al encontrar omisiones para el filtro al tiempo que impedía algunas presentaciones de usuarios legítimos. La solución correcta es utilizar entidades HTML para codificar los datos enviados por el usuario. Cuando los módulos de entidad HTML están habilitados, los caracteres se codifican automáticamente en un formato que el navegador sabe que se mostrarán como los símbolos correctos, pero no se tratarán como código.