Cross-Site Scripting (XSS)

Cuando una aplicación web no tiene los input de usuario sanitizados de forma correcta, un atacante podría inyectar código JavaScript en dicho input.

Las vulnerabilidades de XSS se ejecuta por el lado del cliente, y no afecta directamente el back-end, además, permite a un atacante eludir la política de Same Origen (SOP).

Los XSS funcionan mediante la manipulación de un sitio web vulnerable que devuelve código malicioso a los usuarios. Cuando el código se ejecuta dentro del navegador de la víctima, el atacante puede comprometer completamente su interacción con la aplicación.

La forma más normal de validar la presencia de esta vulnerabilidad es usando la función alert(), pero en 2021 el navegador Chrome previene la llamada de alert(). Por este motivo, se recomienda el uso de la función print(). Algunos recomiendan usar la función console.log(), pero en algunos casos, las funciones de la consola se encuentran deshabilitadas.

Tipos de XSS

Existen tres tipos principales de vulnerabilidades XSS:

  • Stored (Persistent) XSS: es el tipo de XSS más crítico, y ocurre cuando el input es almacenado en el back-end y desplegado cada vez que se consume dicho recurso.

  • Reflected (Non-Persistent) XSS: ocurre cuando el input del usuario se muestra en la página después de ser procesada por el back-end, pero no es almacenado.

  • DOM-based XSS: otro tipo de XSS no persistente que ocurre cuando el input del usuario se muestra directamente en el navegador y se procesa completamente en el lado del cliente, sin llegar al back-end.

¿Qué se puede hacer con un XSS?

  • Suplantar o hacerse pasar por el usuario víctima.

  • Realizar cualquier acción que el usuario sea capaz de realizar.

  • Leer todos los datos a los que el usuario puede acceder.

  • Capturar las credenciales de inicio de sesión del usuario.

  • Realizar defacement del sitio web.

  • Inyectar funcionalidad de troyanos en el sitio web.

Impacto de la vulnerabilidad XSS

El impacto real de un ataque XSS generalmente depende de la naturaleza de la aplicación, su funcionalidad, datos, y el estado del usuario comprometido.

Detección de la vulnerabilidad XSS

La gran mayoría de las vulnerabilidades XSS se pueden encontrar de forma rápida y confiable utilizando el escáner de vulnerabilidades web de Burp Suite (encontrado en la versión Professional de este).

La prueba manual de XSS reflected y Stored normalmente implica enviar una entrada única simple (como una cadena alfanumérica corta) en cada input en la aplicación, identificando cada ubicación donde el input se devuelve en las respuestas HTTP y probando cada ubicación individualmente para determinar si el input adecuadamente diseñado se puede utilizar para ejecutar JavaScript. De esta forma, se puede determinar el contexto en el que se produce el XSS y seleccionar un payload adecuado para explotarlo.

La prueba manual de XSS DOM-based que surge de los parámetros de URL implica un proceso similar: colocar una entrada única simple en el parámetro, usar las herramientas de desarrollo del navegador para buscar esta entrada en el DOM y probar cada ubicación para determinar si es explotable. Sin embargo, otros tipos de DOM XSS son más difíciles de detectar. Para encontrar vulnerabilidades basadas en DOM en entradas no basadas en URL (como document.cookie) o sinks no basados en HTML (como setTimeout), no hay sustituto para revisar el código JavaScript, que puede llevar mucho tiempo.

El escáner de vulnerabilidades web de Burp Suite combina el análisis estático y dinámico de JavaScript para automatizar de manera confiable la detección de vulnerabilidades basadas en DOM.

¿Cómo prevenir ataques XSS?

La vulnerabilidad XSS podría ser mitigada implementando alguna de las siguientes medidas:

  • Filtrar los inputs a la llegada: en el punto donde se recibe la entrada del usuario, filtre lo más estrictamente posible en función de lo que se espera o de lo que debería ser válido en el input.

  • Codificar los datos en la salida: en el punto donde los datos controlables por el usuario se emiten en las respuestas HTTP, codifique la salida para evitar que se interprete como contenido activo. Según el contexto de salida, esto puede requerir la aplicación de combinaciones de codificación HTML, URL, JavaScript y CSS.

  • Uso de encabezados de respuesta apropiados: para evitar XSS en las respuestas HTTP que no están destinadas a contener HTML o JavaScript, puede usar los encabezados Content-Type y X-Content-Type-Options para asegurarse de que los navegadores interpreten las respuestas de la manera que desea.

  • Content Security Policy: como última línea de defensa, puede usar Content Security Policy (CSP) para reducir la gravedad de las vulnerabilidades XSS que aún ocurren.

Para mayor información, revisar el siguiente enlace.

Cheat Sheet

PortSwigger posee el siguiente Cheat Sheet con payloads para explotar la vulnerabilidad XSS.

Last updated