¿Qué es Cross-Site Scripting (XSS) y cómo prevenirlo?

Vivimos en la era de la rápida transformación digital, con soluciones innovadoras que nos permiten realizar una amplia gama de cosas de forma más rápida y sencilla. A medida que las tecnologías siguen avanzando, los hackers y los actores de amenazas crean sofisticados contraataques aprovechando estas tecnologías futuristas.

Aunque los profesionales de la seguridad de la información trabajan constantemente en el desarrollo de herramientas prácticas de ciberseguridad, los usuarios de sitios web están expuestos a nuevas vulnerabilidades, siendo el cross-site scripting (XSS) una de las ciberamenazas más comunes.

¿Qué es el Cross-Site Scripting (XSS)?

Cross-site scripting (XSS) es un ataque de seguridad de inyección de código que permite a un actor de amenaza insertar scripts maliciosos en navegadores web pertenecientes a aplicaciones web o sitios web de confianza. A diferencia de la inyección SQL y otros vectores de ataque que acceden directamente a la base de datos, XSS se centra en el usuario final para obtener el control total de las operaciones.

Suplantando la identidad de los usuarios, el malhechor puede robar la cookie de sesión activa del usuario y acceder a sus datos confidenciales. El navegador de la víctima no puede distinguir el marcado legítimo del malicioso y lo ejecuta.

XSS ocupa el octavo lugar en la lista de las 10 vulnerabilidades más críticas de las aplicaciones web del OWASP. Las clasificaciones del Open Web Application Security Project son proporcionadas por expertos en seguridad de todo el mundo para ayudar a los desarrolladores a salvaguardar cualquier debilidad del sistema y reducir la presencia de riesgos conocidos.

¿Qué es Cross-Site Scripting (XSS) y cómo prevenirlo?

¿Cuáles son los tipos de ataques XSS?

En función del lugar por el que un hacker introduce la entrada maliciosa, el XSS puede dividirse en tres categorías principales:

Cross-Site Scripting almacenadas

El XSS almacenado o XSS persistente es el tipo más peligroso de ataque XSS, que puede comprometer a muchos visitantes y tener consecuencias devastadoras. El XSS almacenado se produce cuando la entrada del usuario no se valida antes de almacenar el contenido y mostrarlo en la página web.

Las redes sociales, los foros, los sitios web de blogs, los perfiles de usuario, los tablones de mensajes y las secciones de comentarios son áreas comunes donde se puede almacenar XSS. Los actores de amenazas aprovechan esta vulnerabilidad inyectando cargas útiles XSS en las páginas web más visitadas. Al hacer clic en el enlace manipulado y abrir la página viral, el navegador web de la víctima ejecuta la carga útil en el lado del cliente.

A continuación se muestra una ilustración clara de una vulnerabilidad XSS almacenada. Un usuario puede dejar mensajes en una aplicación de tablón de anuncios, que otros usuarios pueden ver:

<p>Hello, this is my message!</p>

La aplicación no procesa más los datos, lo que facilita a un estafador el envío de un mensaje dirigido a otros usuarios:

<p><script>/* Bad stuff here... */</script></p>

Cross-Site Scripting reflejadas

El XSS reflejado es el ataque de Cross-Site Scripting entre sitios más comúnmente empleado (también conocido como XSS no persistente). Al realizar este ataque, un hacker añade código malicioso al final de la URL. Una vez que el usuario hace clic en este enlace en su navegador web, el navegador ejecuta la carga útil XSS reflejada.

El autor de la amenaza suele utilizar URL maliciosas, correos electrónicos de phishing y otros ataques de ingeniería social digital para engañar a la víctima y hacer que haga clic en el enlace. Por regla general, los siguientes ataques XSS se realizan utilizando las redes sociales.

Para ilustrar la vulnerabilidad XSS reflejada, eche un vistazo al siguiente ejemplo:

https://insecure-website.com/status?message=All+is+well.
<p>Status: All is well.</p>

La aplicación web no realiza ningún procesamiento de datos adicional, lo que permite a un hacker ejecutar el siguiente ataque:

https://insecure-website.com/status?message=
<p>Status: <script>/* Bad stuff here... */</script></p>

Cross-Site Scripting basado en DOM

Los autores pueden insertar código malicioso en una página debido a la modificación del entorno DOM (Document Object Model) cuando no filtra correctamente la entrada del usuario. El código fuente HTML y la respuesta del ataque son idénticos en el XSS basado en DOM. La página en sí sigue siendo la misma, pero debido a los cambios maliciosos realizados en el entorno DOM, el código del lado del cliente de la página se ejecuta de forma inesperada.

El XSS basado en DOM es completamente una vulnerabilidad de inyección del lado del cliente. Por lo tanto, la carga útil parásita nunca llega al servidor. Debido a la naturaleza única del XSS basado en DOM, es difícil que los cortafuegos de aplicaciones web (WAF) y otras herramientas de seguridad de aplicaciones web detecten los ataques.

La aplicación web del siguiente ejemplo emplea JavaScript para leer el valor de un campo de entrada y escribir ese valor en un elemento dentro del HTML:

var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;

Si el actor de la amenaza tiene control sobre el valor del campo de entrada, puede crear fácilmente un valor malicioso que haga que su script actúe de forma insegura:

You searched for: <img src=1 onerror='/* Bad stuff here... */'>

How can threat actor exploit XSS?

Por regla general, el contenido malicioso enviado al navegador web adopta la forma de un segmento de JavaScript, pero también puede incluir HTML, Flash, VBScript, ActiveX o cualquier otro código que el navegador pueda ejecutar.

Los ataques XSS basados en JavaScript son los más extendidos, ya que JavaScript es un componente subyacente de la mayoría de las experiencias de navegación.

JavaScript puede leer cookies en el navegador, lo que permite al autor realizar un ataque XSS y hacerse pasar por el usuario para robar su identidad y realizar otras actividades nefastas. JavaScript proporciona varios módulos y métodos para realizar peticiones HTTP, que pueden utilizarse para enviar datos (como cookies robadas) al autor de la amenaza. Es más, la vulnerabilidad de JavaScript del lado del cliente a la piratería puede ayudar a los estafadores a recibir acceso a las API y comprometer fácilmente la ubicación geográfica de los clientes, los datos de la cámara web y otra información privada.

Aprovechando las vulnerabilidades XSS, un actor de amenaza puede llevar a cabo actividades maliciosas, tales como:

  • Secuestrar la sesión del usuario. El secuestro de sesión es un método para apoderarse de la sesión autenticada de un usuario. Las cookies de sesión contienen datos críticos que pueden permitir a un actor de amenaza hacerse pasar por un usuario legítimo y obtener el ID de sesión si se ve comprometido.
  • Realizar acciones no autorizadas. Los atacantes no pueden robar las cookies a través de JavaScript si el atributo de cookie HTTPOnly está configurado. Pero, realizando el ataque XSS, aún pueden llevar a cabo actividades no autorizadas dentro de la aplicación en nombre de la víctima.
  • Realizar ataques de phishing. El phishing es un tipo común de ciberataque en el que el autor inyecta un formulario en la página vulnerable y utiliza ese formulario alterado para robar la información de credenciales del usuario, normalmente en forma de contraseñas, información de cuentas bancarias y números de tarjetas de crédito.
  • Capturar las pulsaciones de teclado de los usuarios. Aquí es donde un hacker inserta un keylogger JavaScript en la página vulnerable y monitoriza las pulsaciones de la víctima en la página web actual. La información recopilada puede revelar nombres de usuario, contraseñas y datos potencialmente comprometedores que los hackers pueden utilizar para obtener beneficios económicos.
  • Robar información sensible. Al realizar un ataque XSS, un agresor recopila datos de la sesión actual del usuario. Por ejemplo, los ataques de Cross-Site Scripting entre sitios en aplicaciones de banca en línea pueden permitir a los atacantes ver el saldo actual, detalles de transacciones, información personal, etc.

Las vulnerabilidades XSS favorecen la escalada de los ataques a un nivel más grave y, si los estafadores abusan de ellas, pueden causar graves daños. Los ataques XSS pueden llevar a la exposición de datos sensibles, comprometer la cuenta de la víctima y cosas peores.

Mediante la creación de un formulario falso, los atacantes atraen a los internautas para que faciliten sus datos de acceso, lo que les permite recibir toda la información sobre el usuario. Una vez cumplida la astuta intención de los hackers de engañar a sus víctimas, los datos obtenidos pueden utilizarse para el robo de identidad o el fraude financiero.

Ejemplos reales de XSS

Los ataques cross-site scripting han sido capaces de causar estragos en empresas muy conocidas. Los siguientes son los ejemplos más famosos:

Fortnite

Fortnite es un fenómeno de los videojuegos: uno de los juegos de batalla en línea más populares con más de 200 millones de jugadores en todo el mundo. Debido a su enorme popularidad, la plataforma de juego se convirtió en el principal objetivo de los actores maliciosos y podría enfrentarse a un ataque XSS que conduzca a la fuga de datos a principios de 2019.

Investigadores de seguridad de Check Point Software Technologies han descubierto la vulnerabilidad cross-site scripting en el juego que podría haber permitido a los hackers hacerse con las cuentas de los jugadores, acceder a su información sensible, robar moneda virtual del juego y espiar sus conversaciones. Los expertos han informado en privado sobre las vulnerabilidades XSS identificadas al desarrollador del juego, Epic Games, y la empresa ha corregido los problemas.

British Airways

En 2018, British Airways se enfrentó a una violación de datos que afectó a 380.000 transacciones de reserva. Los investigadores de RiskIQ lograron atrapar a Magecart, uno de los mayores grupos de hackers conocidos por emplear técnicas de skimming online. Los hackers atacaron el sitio web de British Airways aprovechando una vulnerabilidad XSS en una biblioteca JavaScript llamada Feedify.

Una vez modificado el script, los delincuentes enviaron los datos de los clientes al servidor que habían designado con un nombre de dominio similar al de British Airways y consiguieron robar las tarjetas de crédito. El servidor malicioso tenía un certificado SSL, por lo que los clientes confiaban plenamente en el servidor en el que compraban.

eBay

eBay es una de las plataformas de comercio electrónico más antiguas y populares. Sin embargo, se vio comprometida a través de una vulnerabilidad de cross-site scripting a finales de 2014 y principios de 2015. El sitio web utilizaba un parámetro de URL que redirigía a los usuarios de eBay a diferentes páginas, pero el valor del parámetro no se comprobaba antes de incluirlo en la página. Debido a este fallo, los atacantes podían elaborar una URL que contuviera un iFrame parásito e inyectarlo en el sitio web legítimo de eBay.

De este modo, los estafadores podían acceder a las cuentas de los vendedores de eBay, robar datos de pago, vender productos con descuento y manipular los listados de eBay de productos valiosos, como vehículos. Aunque eBay corrigió posteriormente el problema, los ataques recurrentes continuaron hasta 2017.

Facebook

En 2011, se detectaron tres vulnerabilidades XSS distintas en sitios de Facebook en 10 días. Al menos dos se utilizaron para difundir enlaces virales y ataques a usuarios de Facebook para acceder o cambiar información de sus cuentas.

Debido a un filtrado insuficiente de JavaScript, el primer problema se produjo a través de una página de la versión API móvil de Facebook. La interfaz incitaba a los usuarios a publicar un mensaje arbitrario en sus muros. Además, se desarrolló una segunda vulnerabilidad XSS utilizando HTML dentro de una página viral para propagar malware por el sitio web. Varios enlaces distribuyeron rápidamente ataques de pesca, lo que llamó la atención de los investigadores de seguridad, y Facebook consiguió parchear con éxito la vulnerabilidad XSS.

El último problema de XSS que salió a la luz fue con una página de “canal” de Facebook para la gestión de sesiones, donde una actualización de código modificó por error el comportamiento de la página. Sin embargo, una vez que los expertos en seguridad se percataron de ello, Facebook corrigió inmediatamente el fallo.

Detección de vulnerabilidades de Cross-Site Scripting

Las razones de la aparición de vulnerabilidades XSS son:

  • No se realiza la validación de la entrada.
  • La salida al navegador no se convierte en entidades de caracteres HTML.

Generalmente, se utilizan herramientas de exploración web para buscar vulnerabilidades de seguridad en las aplicaciones web. Estas herramientas automatizadas inyectan scripts maliciosos en la aplicación web, como variables GET o POST, URL, cookies y otros códigos que podrían llevar a cabo ataques XSS. Si la herramienta consigue inyectar el script en la página web, el sitio queda expuesto a XSS. Tras descubrir los vectores de ataque del malware, la herramienta notifica al usuario la vulnerabilidad detectada.

Prevención y mitigación de XSS

El Cross-site Scripting (XSS) puede amenazar seriamente a los usuarios individuales y a las empresas cuyos sitios web puedan estar infectados. En algunos casos, es difícil impedir el ataque. Por esta razón, debe desinfectar a fondo todos los datos que no sean de confianza para mantenerse a salvo de XSS. Para reducir el riesgo para su aplicación web, nunca permita que su navegador procese datos recibidos como entrada sin validarlos.

Los métodos de prevención específicos varían en función del subtipo de vulnerabilidad XSS y del contexto de uso de la entrada del usuario. Sin embargo, se deben tomar ciertas medidas generales para proteger a sus usuarios contra ataques XSS y mantener su aplicación web segura:

Validación

Aquí es donde se garantiza que las entradas son seguras para su procesamiento dentro del código y que los datos malformados no dañan un sitio web, una base de datos y a los usuarios. Al rechazar solicitudes de partes o fuentes externas, la validación de entradas impide que los usuarios introduzcan caracteres especiales en los campos de entrada de datos de los sitios web. La validación de entrada disuade los ataques de inyección, las fugas de datos y los sistemas comprometidos.

Codificación

La codificación es una línea esencial de defensa contra XSS. Aquí, en el punto donde los datos controlables por el usuario se emiten en respuestas HTTP, se codifica la salida para que el navegador la interprete sólo como datos, no como código ejecutable. Pueden ser necesarios varios métodos de codificación dependiendo del contexto de salida, ya que los navegadores analizan JavaScript, JS, URL, HTML y CSS de forma diferente.

Establecer banderas HttpOnly

El siguiente método de precaución ayuda a mitigar los ataques XSS. Si se incluye esta bandera adicional en la cabecera de respuesta HTTP, no se podrá acceder a la cookie que contiene la información confidencial del usuario a través del script cliente. Emplee el atributo HttpOnly para impedir que JavaScript lea el contenido confidencial de la cookie, dificultando así que un pirata informático secuestre la sesión y se haga con el control de la cuenta.

Política de seguridad de los contenidos

La Política de Seguridad de Contenidos (CSP) es una capa adicional de seguridad diseñada para reducir la gravedad de cualquier vulnerabilidad XSS que pueda producirse. Esta herramienta de seguridad del navegador ayuda a repeler y mitigar XSS y otros ataques del lado del cliente.

Escaneado regular

Debe ejecutar un sólido escáner de vulnerabilidades web en sus servidores web para evitar que usuarios o visitantes inconscientes ejecuten contenido malicioso. Los pentesters y expertos en seguridad utilizan regularmente herramientas de escaneo XSS para el análisis de aplicaciones web.

Pruebas de penetración

Las pruebas de penetración son una técnica de ciberseguridad que utiliza la perspectiva del hacker para encontrar puntos débiles en los sistemas y mitigar los riesgos de ciberseguridad, permitiendo a las organizaciones cerrar las brechas identificadas antes de que los hackers malintencionados lleguen a ellas.

El análisis de vulnerabilidades no sustituye a las pruebas de penetración. Los pentesters imitan los enfoques de los actores de amenazas del mundo real, concentrándose en las vulnerabilidades de seguridad que no pueden identificarse automáticamente.

El equipo de QAwerk está formado por pentesters profesionales que dominan las herramientas avanzadas para llevar a cabo auditorías de seguridad y evaluaciones de vulnerabilidades exhaustivas.

¿Cómo corregir eficazmente los errores XSS?

Puede tomar varias medidas para arreglar su sitio web si se produce cross-site scripting:

  • Encontrar el código vulnerable. En la fase inicial de la recuperación de Cross-Site Scripting, identifique la ubicación de la vulnerabilidad.
  • Elimine el contenido malicioso y las puertas traseras. Una vez que sepa dónde se encuentra el malware, puede eliminar cualquier contenido malicioso o dato incorrecto de su base de datos y restaurarla a un estado limpio con una sólida herramienta de eliminación de malware de sitios web. Además, debe escanear el resto de su sitio web y los sistemas de archivos en busca de puertas traseras para corregir los errores existentes y mantener la reputación de su sitio web.
  • Parchee la vulnerabilidad. Los agresores se aprovechan con frecuencia de los puntos débiles de bases de datos, aplicaciones y componentes de terceros. Si suponen un riesgo real, hay que parchearlos. Una vez identificado el software vulnerable, distribuya y aplique actualizaciones al código vulnerable para eliminar las vulnerabilidades señaladas.
  • Cambie sus credenciales. En caso de XSS, es crucial restablecer inmediatamente las contraseñas y los secretos de las aplicaciones con una política de contraseñas segura una vez que se haya parcheado la vulnerabilidad. Asegúrese de que no hay puertas traseras ni usuarios administradores deshonestos en la base de datos limpiando sus datos para evitar la reinfección.
  • Instale un WAF. Un componente clave de su estrategia de seguridad es la creación de un potente cortafuegos de aplicaciones web (WAF) para abordar específicamente el XSS mediante el bloqueo de las solicitudes de servidor maliciosas a su sitio web que tienen como objetivo filtrar datos confidenciales. Con un WAF adecuado, puede protegerse contra amenazas potenciales antes de que los parches estén disponibles.

En conclusión

Los ataques de Cross-Site Scripting aprovechan los agujeros de seguridad de la web permitiendo a un actor de la amenaza eludir los mecanismos de seguridad del lado del cliente e inyectar código JavaScript malicioso en sitios web por lo demás benignos. En función de la funcionalidad y los datos procesados por la aplicación vulnerable, las vulnerabilidades XSS pueden suponer una amenaza significativa para las empresas. Al hacerse pasar por una fuente de confianza con una solicitud tentadora, los piratas informáticos pueden suplantar las cuentas de los usuarios, observar su comportamiento, cargar contenido externo y apoderarse de todas las sesiones web de los usuarios víctimas.

Por lo tanto, es crucial entender dónde tiene fallos su sistema y tomar medidas preventivas antes de que un ataque XSS perjudique seriamente al sitio web y a sus visitantes. A menos que las variables de una aplicación web pasen por un proceso de validación, son una vulnerabilidad potencial. Los métodos de protección más eficaces para impedir los ataques XSS son: el saneamiento de datos, la protección contra cookies, la eliminación de etiquetas HTML de las cadenas, el escaneado de vulnerabilidades y las pruebas de penetración periódicas realizadas por profesionales.