Ataque cross-site scripting o XSS definición y prevención
Ataque cross-site scripting o XSS definición y prevención

Ataque XSS: Definición, Tipos, Casos y Prevención

Es fácil convencerse del peligro que representan las últimas y más notables amenazas en línea, pero los ciberataques de vanguardia no son necesariamente tan extendidos o tan persistentemente peligrosos como los más antiguos. Por ejemplo, el cross-site scripting (XSS): Microsoft identificó y clasificó por primera vez los ataques XSS en el año 2000, pero los registros de ataques XSS se remontan a los primeros días de Internet. El sitio web de alojamiento de recompensas de errores HackerOne informó que el XSS sigue siendo la vulnerabilidad más comúnmente encontrada entre los usuarios de su plataforma.

Dado que es poco probable que la amenaza del cross-site scripting disminuya, es esencial que los usuarios de Internet y los desarrolladores web sepan qué es el XSS y cómo prevenir estos ciberataques.

Esto es lo que debes saber sobre los ataques XSS.

¿Qué es el Cross-Site Scripting?

Cross-site scripting (XSS) es lo que ocurre cuando un atacante se aprovecha de una vulnerabilidad en una página web para inyectar su propio código. Ese código puede robar información del usuario, como credenciales, cookies de sesión y otros datos sensibles, e incluso puede vivir de forma persistente en un sitio para atacar a múltiples usuarios.

Explicación del ataque Cross-Site Scripting
Explicación del ataque Cross-Site Scripting o XSS

Un ataque XSS es único porque estas vulnerabilidades no se dirigen al sitio web o a la aplicación web que explotan: es sólo un vector de ataque. El XSS utiliza scripts que se ejecutan en la máquina del usuario; estos scripts se denominan scripts del lado del cliente. La gran mayoría de ellos están codificados en JavaScript o HTML, aunque hay otros lenguajes que pueden utilizarse para los scripts del lado del cliente.

Tipos de Ataques Cross-Site Scripting (XSS)

Existen diferentes tipos de ataques XSS, que distinguen si los scripts maliciosos pueden ser inyectados de forma no persistente o persistente. Además, hay una diferenciación entre la vulnerabilidad causada por una validación de entrada defectuosa en el lado del cliente o del servidor.

Tipos de ataques Cross-Site Scripting o XSS
Tipos de ataques Cross-Site Scripting o XSS

Existen 3 tipos principales de ataques de cross-site scripting:

  1. XSS almacenado (Stored Cross-Site Scripting)
  2. XSS reflejado (Reflected Cross-Site Scripting)
  3. XSS basado en el DOM (DOM-based Cross-Site Scripting)

Cross-Site Scripting Almacenado (persistente)

Una vulnerabilidad de XSS almacenado permite a un atacante inyectar un script malicioso de forma persistente en una aplicación web.

En un ejemplo de XSS almacenado, el script podría haber sido enviado a través de un campo de entrada al servidor web, que no realizó una validación suficiente y almacena el script de forma persistente en la base de datos. La consecuencia de esto podría ser que este script está siendo entregado a todos los usuarios que visitan la aplicación web y, por ejemplo, puede obtener acceso a las cookies de sesión del usuario.

  • El script se almacena de forma persistente en la aplicación web
  • Los usuarios que visitan la aplicación después de la infección recuperan el script
  • El código malicioso aprovecha los fallos de la aplicación web
  • El script y el ataque son visibles en el lado del servidor (para el propietario de la aplicación)

Cross-Site Scripting Reflejado (no persistente)

Una vulnerabilidad XSS reflejado aparece si se muestra directamente al usuario una entrada no validada.

En un ejemplo de XSS reflejado, la entrada de un formulario de búsqueda se refleja en la página para mostrar la clave de búsqueda. Un atacante puede elaborar una URL que contenga código malicioso y difundirla a través del correo electrónico o las redes sociales. Un usuario que hace clic en este enlace abre la aplicación web (válida), que entonces ejecuta el código malicioso en el navegador del usuario.

  • El script no se almacena en la aplicación web
  • El código malicioso sólo se muestra a un usuario
  • Los usuarios que abren el enlace ejecutan el script cuando se abre la aplicación
  • El script y el ataque no son necesariamente visibles en el lado del servidor (para el propietario de la aplicación)

Cross-Site Scripting basado en el DOM

DOM significa Document Object Model y es una interfaz para las páginas web. Es esencialmente una API para la página, que permite a los programas leer y manipular el contenido, la estructura y los estilos de la página.

Un ataque XSS basado en el DOM puede ejecutarse con éxito incluso cuando el servidor no incrusta ningún código malicioso en la página web utilizando un fallo en el JavaScript ejecutado en el navegador web. Por ejemplo, si el JavaScript del sitio cliente modifica el árbol DOM de la página web basándose en un campo de entrada o un parámetro GET sin validar la entrada, se puede ejecutar código malicioso.

  • El script no se almacena en la aplicación web
  • El código malicioso se muestra a un solo usuario
  • El código malicioso aprovecha los fallos del navegador en el lado del usuario
  • El script y el ataque no son necesariamente visibles en el lado del servidor (para el propietario de la aplicación)

Ejemplo de Cross-site Scripting

El cross-site scripting puede ser explotado cuando una aplicación web utiliza los datos suministrados por el navegador para crear respuestas a las peticiones del usuario. Un ejemplo muy simplista sería un caso en el que una aplicación web hace uso de un parámetro en la URL para proporcionar una respuesta personalizada al usuario.

Digamos que ejemplo.com/perfil contiene un parámetro de nombre. La URL de la solicitud sería como https://ejemplo.com/perfil?user=esgeeks. La aplicación web responde con “Hola EsGeeks” en la parte superior de la página basándose en esta entrada.

Si el parámetro de usuario no se valida para garantizar que sólo contiene los datos esperados, un atacante podría hacer que un usuario visitara una versión maliciosa de la URL con el siguiente aspecto https://ejemplo.com/perfil?esgeeks<script>algún_código_malicioso</script>.

Cuando la respuesta se envía al navegador, incluye ese script malicioso que se ejecuta en el navegador, probablemente sin que el usuario lo sepa. Este es un ejemplo de ataque XSS reflejado. El código malicioso se “refleja” inmediatamente en el usuario que realiza la solicitud.

¿Qué tan Grande es la Amenaza del Cross-Site Scripting?

Los ataques XSS son sencillos: todo lo que un atacante necesita es un sitio web vulnerable y un poco de conocimiento básico de JavaScript y HTML para perturbar la vida de una persona. En otras palabras, el cross-site scripting es una gran amenaza. La mera persistencia del XSS debería ser suficiente para preocupar a cualquiera: ha sido un problema desde mediados de la década de 1990 y sigue siendo un problema importante.

Amenaza de un ataque Cross-Site Scripting
Amenaza de un ataque Cross-Site Scripting

Un estudio reciente de Positive Technologies ha revelado que cerca de tres cuartas partes de los sitios web analizados son vulnerables a los ataques XSS. Si Positive Technologies está en lo cierto, esto lo convierte, con diferencia, en el fallo más comúnmente explotable en Internet.

Los ataques XSS son capaces de robar datos sensibles de los usuarios. Uno de los objetivos más delicados del XSS son las cookies de sesión, que verifican la identidad de un usuario en un sitio web para permitirle seguir conectado mientras visita varias páginas de un dominio.

Si un atacante de XSS logra robar una cookie de sesión, puede duplicar la sesión activa del usuario, dándole acceso a todo lo que el usuario puede hacer en un sitio web: hacer publicaciones en redes sociales, editar información personal/de cuenta, cambiar contraseñas, robar información de tarjetas de crédito, hacer transferencias bancarias, comprar productos en un sitio de comercio electrónico, etc.

¿Cuáles son los Ejemplos de los Principales Ataques de Cross-Site Scripting?

Ejemplo de ataque Cross-Site Scripting en Twitter
Ejemplo de ataque Cross-Site Scripting en Twitter

No es difícil encontrar pruebas de ataques XSS en sitios importantes que se remontan a más de una década. Los artículos de noticias abundan con historias de ataques XSS exitosos, algunos de los cuales incluso quedaron sin arreglar años después del incidente inicial.

  • En 2008 se publicó en Facebook una prueba de concepto de XSS. Facebook parcheó la vulnerabilidad poco después de su revelación, aunque no se sabe si hubo víctimas de ataques maliciosos antes de su descubrimiento público.
  • El rediseño de Twitter en 2010 contenía una vulnerabilidad XSS de la que fue víctima Sarah Brown, la esposa del ex primer ministro británico Gordon Brown, y que compartió sin saberlo con sus +1.000.000 de seguidores. El exploit ni siquiera requería un clic -simplemente pasar el ratón por encima- para redirigir a los usuarios a un sitio web pornográfico.
  • Los usuarios de eBay llevan años lidiando con posibles scripts XSS incrustados en los listados de artículos, y a principios de 2017 el problema aún no se había solucionado. En este caso, los vendedores maliciosos añadieron scripts a los listados de productos legítimos para redirigir a los usuarios a una página de inicio de sesión falsa que recogía las credenciales antes de redirigir a los usuarios a una página legítima de eBay.
  • Cerca de 400.000 reservas de British Airways se vieron comprometidas por un XSS dirigido al sistema de pago de la aerolínea en su sitio web y en su aplicación móvil. Posiblemente se robaron los datos de las tarjetas de crédito y débito de todas esas transacciones.
  • El gusano Samy, que afectó a MySpace en 2005, añadió una línea sobre el desarrollador del gusano en el perfil de todos los usuarios, diciendo que era el héroe de la víctima. A pesar de su naturaleza benigna, el Gusano Samy utilizó XSS para infectar a más de un millón de usuarios de MySpace en menos de 20 horas, convirtiéndose en el gusano de más rápida propagación en la historia de Internet.
  • Yahoo se enfrentó a muchos problemas de seguridad en los días de declive de su supremacía en el correo electrónico, uno de los cuales fue un ataque de phishing XSS en 2013 que resultó en el robo de las cuentas de las víctimas.

Estos ejemplos son, por desgracia, sólo algunos de los principales y más conocidos ataques de cross-site scripting. Es totalmente posible -y bastante probable- que se produzcan otros ataques XSS que den lugar al robo de información personal.

¿Cómo Prevenir los Ataques XSS?

Las vulnerabilidades de Cross-Site Scripting son difíciles de identificar y remediar. ¿Qué se puede hacer? para prevenir los ataques XSS, tratar toda la entrada del usuario como potencialmente maliciosa y seguir algunas pautas de programación:

Concejos para prevenir ataques XSS
Concejos para prevenir ataques XSS

Evitar la entrada no fiable

Los ataques XSS sólo aparecen si se muestra alguna entrada del usuario en la página web. Por lo tanto, intenta evitar mostrar cualquier entrada del usuario (no fiable), si es posible. Si necesitas mostrar datos del usuario, restringe los lugares en los que puede aparecer la entrada del usuario. Cualquier entrada mostrada dentro de una etiqueta JavaScript o una URL mostrada en el sitio es mucho más probable que sea explotada que la entrada que aparece dentro de un elemento div o span dentro del cuerpo HTML. (Aprende más sobre HTML aquí)

Filtrar la entrada del usuario

Cuando cualquier entrada no fiable se muestra como texto normal dentro de una etiqueta HTML, filtra los caracteres que permiten a un atacante insertar una etiqueta <script> en la página. Para ello, utiliza las siguientes funciones:

htmlspecialchars($input)                                    # PHP
html.escape(input, quote=True)                              # Python
org.apache.commons.lang.StringEscapeUtils.escapeHtml(input) # Java

En JavaScript, es necesario definir una función adicional para esta tarea. Puedes utilizarla:

function escapeHtml(text) {
  var map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };
 
  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}

Cuando la entrada del usuario necesita ser insertada en los atributos de la etiqueta o dentro de un script, necesitarás usar mecanismos de escape más fuertes. Consulta la hoja de trucos para la prevención de XSS para obtener más información. Este es el caso si planeas permitir la entrada del usuario en casos como:

<a href="http://example.org/search/q?...USER INPUT..."></div>
<script>alert('...USER INPUT...')</script>
<style> { property: ...USER INPUT...; } </style>

Corregir el XSS basado en el DOM

Para evitar un ataque XSS basado en el DOM, puedes utilizar una propiedad JavaScript guardada como ‘element.textContent’ para la entrada del usuario no fiable. Esto evita que el navegador renderice el potencial código JavaScript dentro de la ‘untrustedVariable’. Uno de los ejemplos de Dom XSS podría ser como el siguiente fragmento de código:

element.textContent = untrustedVariable

Además, es importante utilizar funciones JavaScript seguras como ‘inner text o ‘text content’ en lugar de ‘innerHtml’. Siempre es bueno tener en cuenta que es peligroso pasar entradas controladas por el usuario a tu aplicación web sin una sanitización adecuada.

Para más información, OWASP proporciona una hoja de trucos específica para la prevención de XSS basado en el DOM, que contiene un conjunto adicional de reglas para asegurar tu aplicación web contra el XSS basado en el DOM.

Utilizar una herramienta de vulnerabilidad XSS

Como se mencionó anteriormente, los ataques XSS son a veces difíciles de detectar. Sin embargo, esto puede cambiar si se obtiene alguna ayuda externa. Otra forma de prevenir los ataques XSS es utilizar la herramienta XSS scanner de Crashtest Security Suite, un escáner de vulnerabilidades web con una prueba gratuita de 14 días en la que encontrarás cualquier vulnerabilidad a la que puedas estar expuesto. Sin embargo, las pruebas manuales son muy largas y costosas – y por lo tanto no es posible hacerlas para cada iteración de tu aplicación web.

En consecuencia, tu código no debería estar sin probar antes de cualquier lanzamiento.

Utilizando la seguridad automatizada, puedes escanear tu aplicación web en busca de Cross-Site Scripting y otras vulnerabilidades críticas antes de cada lanzamiento que hagas. De esta manera, puedes asegurarte de que la versión en vivo de tu aplicación web siga siendo segura cada vez que alteres o añadas una característica.

¿Cómo pueden los Internautas Protegerse de los Ataques de Cross-Site Scripting?

El XSS es principalmente un problema para los desarrolladores cuyos sitios son explotados para pasar scripts de sitio cruzado a los usuarios. No hay mucho que los usuarios finales puedan hacer para protegerse de los ataques XSS, ya que estas vulnerabilidades se basan en un código débil del sitio web para funcionar.

Sin embargo, esto no significa que no tengas suerte en lo que respecta a la prevención de ataques XSS, sino que tus opciones son limitadas. Si quieres añadir más protección entre tú y un sitio web potencialmente no fiable, sigue estos consejos.

  • Nunca hagas clic en un enlace de correo electrónico que te pida que inicies sesión en un sitio web: podría ser una solicitud de phishing o podría estar cargado con XSS que (incluso si te lleva a un sitio web legítimo) están preparados para robarte. Si recibes un correo electrónico en el que se te pide que hagas clic en un enlace de inicio de sesión, siempre es mejor abrir un navegador e iniciar sesión en tu cuenta sin seguir el enlace.
  • Utiliza un complemento del navegador que bloquee los scripts, como ScriptSafe (Chrome) o NoScript (Firefox). Estos complementos bloquean completamente la ejecución de los scripts a menos que los permitas manualmente; esto debería evitar que los ataques XSS puedan ejecutarse.
  • Evita hacer clic en los enlaces de las redes sociales si una publicación o un mensaje privado te parecen inusuales. Las cuentas secuestradas se utilizan a menudo para propagar malware y lanzar ataques XSS, y para evitarlos hay que estar atento de la misma manera que se evita un correo electrónico de phishing.

Herramientas de Código Abierto para XSS

En EsGeeks, hemos compartido diferentes herramientas de código abierto en lo que se refiere al pentesting de XSS. Algunas de ellas son:


En conclusión, los ataques XSS proliferan en el mundo online actual. La presencia de bugs XSS dificulta su detección por parte de los webmasters. Por ello, los administradores de sitios web deben realizar auditorías de seguridad web periódicas para detectar cualquier error de XSS.

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda