Cross-Site Scripting (XSS) es una vulnerabilidad que está ampliamente extendida y permite insertar código malicioso (JavaScript) a un atacante en tu navegador usando una aplicación web vulnerable. El atacante puede mandar su código malicioso de varias formas. Puede engañarte haciéndote hacer click en un enlace (XSS Reflejado), or esperar a que visites una página que ya tiene el código malicioso incluido en ella (XSS Almacenado o Persistente).
¿Qué es esa molesta ventana con el número 1? Es simplemente una forma en la que la gente demuestra visualmente que su código en JavaScript (XSS) ha sido ejecutado. Pero no dejes que esa inocente ventana te engañe. ¡XSS es mucho más que eso!
¡Un hacker puede robar tus 'cookies' y acceder a la aplicación como tu mismo!
Puede redireccionarte a una página web maliciosa, sin que te dés cuenta, en un intento de engañarte para que reveles información personal como tus datos bancarios.
Puede añadir páginas falsas de login a la aplicación vulnerable para engañarte de forma que reveles tu nombre de usuario y contraseña.
Puede incluso usar XSS para evitar otras medidas de seguridad que hayan sido desarrolladas en la aplicación y en tu navegador para protegerte.
Las posibilidades son casi ilimitadas. ¿Acceder a tu webcam? ¡Si! ¿Escuchar lo que se oye en el micrófono de tu ordenador? ¡Claro!
Para ataques avanzados echa un vistazo a El Framework de Explotación de Navegadores (BeEF)
Los servidores de la fundación Apache, los creadores y mantenedores de uno de los más populares servidores web en Internet, fueron hackeados en un ataque que empezó con XSS.
Un ataque XSS en el foro oficial de Ubuntu, un popular sistema operativo Linux, permitió a los atacantes descargar los usuarios, direcciones de correo y contraseñas de 1.82 millones de usuarios.
Los ataques XSS normalmente se dirigen a los usuarios de la aplicación y sus redes locales; sin embargo, tal y como se puede ver en los ejemplos anteriores, cuando los usuarios son administradores los servidores web también están en peligro.
Las vulnerabilidades XSS se descubren diariamente en Facebook, Yahoo, Google, Twitter y otras páginas web de renombre por investigadores de seguridad que participan en programas de recompensa por errores (bug bounties).
Aquí hay una lista de otros ataques usando XSS - https://www.google.com/fusiontables/DataSource? snapid=S1158702BBoVAsegúrate de que tu navegador web se mantenga actualizado y de que tenga todas sus medidas de seguridad habilitadas, como por ejemplo filtros contra Cross-Site Scripting (XSS). Si tu navegador no tiene un filtro contra XSS, como Firefox, puedes descargar un complemento que proporciona protección contra XSS llamado NoScript.
Ten cuidado con los enlaces en los que haces click. Aunque parezca inofensivo, un enlace puede contener código malicioso con XSS.
Finaliza la sesión en páginas web tan pronto como acabes de usarlas, esto hace más difícil que los hackers roben tus 'cookies'.
Cross-Site Scripting ocurre cuando información de fuentes no confiables se incluye en una página sin ser primero filtrada y/o correctamente codificada.
Por ejemplo, si un usuario proporciona su nombre de usuario para iniciar su sesión y la aplicación muestra este nombre de usuario sin filtrado y/o codificación... ¿Qué pasa si el nombre de usuario contiene caracteres HTML? El navegador no podrá ver la diferencia entre el nombre de usuario y el código HTML válido de la aplicación. ¡La información (el nombre de usuario) se confunde con el código (el HTML legítimo)! Esto podría permitir a un usuario iniciar su sesión utilizando un nombre de usuario que contenga código JavaScript malicioso y que este se ejecute en el navegador en el contexto de tu aplicación web.
Asegúrate de que filtras el nombre de usuario antes de utilizarlo, por ejemplo, si el nombre de usuario solo puede contener caracteres alfanuméricos entonces valida que esto sea así. ¡Utiliza una lista blanca! Compara el nombre de usuario contra "buenos caracteres conocidos" en vez de "malos caracteres conocidos".
¡Utiliza la codificación correcta! Si el nombre de usuario va a ser mostrado en código HTML, entonces codifica todos los caracteres del nombre de usuario para HTML. Así el navegador sabrá qué es lo que debe renderizarse como HTML y qué no. Sin embargo, ¡la codificación HTML no lo es todo! Debes codificar para el "contexto" de renderización correcto. Mira los enlaces abajo para más información.
Escanea tus aplicaciones buscando XSS. Hay muchos escaneadores automatizados de seguridad web que encontrarán XSS en aplicaciones web. Podrías probar OWASP ZAP, que es un programa de código abierto.
Crea las cookies de sesión con la propiedad HttpOnly habilitada. Esto indica al navegador que la cookie no puede ser leída por JavaScript, lo que ayuda a proteger a tus usuarios contra robos de sesión.
Un encabezado HTTP llamado Content Security Policy (CSP) puede ser enviado por el servidor web para indicar al navegador que código JavaScript puede ejecutarse y desde donde. ¡Utiliza una lista blanca!
Finalmente, ¡por qué no instalar un Firewall de Aplicaciones Web (WAF) como mod_security, que es un proyecto de código abierto! Un WAF proporcionará a tu aplicación una capa más de seguridad para defenderte de esos atacantes pero solo debe usarse como una medida de defensa en profundidad y no como la única solución ya que las medidas de seguridad pueden ser evitadas de forma frecuente.
¡Los dos tipos de XSS mencionados en esta página (Reflejado y Almacenado) no son los unicos dos! Solo hemos introducido el tópico aquí. ¿Quieres averiguar más?
El Proyecto Abierto de Seguridad Web (OWASP) es una gran fuente de información para todos los temas relacionados con la seguridad de aplicaciones web. Mira su artículo wiki sobre XSS o su Hoja de referencia rápida para la prevención de XSS. Respecto a información sobre otros tipos de vulnerabilidades de aplicaciones web mira el OWASP Top 10.
Gracias por leer estas líneas,
Ryan Dewhurst & Thomas MacKenzie
---
Los objetivos de esta página son la sencillez, usando Español simple, de forma breve y precisa.
El diseño de esta página fue inspirado por http://justinjackson.ca/words.html
---
Thanks to Abraham Aranguren for this translation and Miguel Dilaj for his comments. English version here.