Articles

Scripting cruzado de sitios basado en DOM

Posted on

La técnica XSS menos conocida

  • DOM significa Document Object Model
  • XSS significa cross-site scripting
  • La principal diferencia entre las vulnerabilidades XSS basadas en DOM y otras vulnerabilidades XSS es que la carga útil está incrustada en el lado del cliente en lugar de en el lado del servidor
  • Las vulnerabilidades XSS basadas en DOM, por lo tanto, deben prevenirse en el lado del cliente

Vulnerabilidades de scripting entre sitios (XSS) primero se dio a conocer a través del CERT Advisory CA-2000-02 (Etiquetas HTML Maliciosas Incrustadas en Solicitudes Web de Clientes), aunque estas vulnerabilidades se habían explotado antes. Así que XSS ya ha existido por un tiempo. Y como era de esperar, ya ha habido una serie de artículos de Labs sobre el tema, incluyendo Cross Site Scripting – El Peligro Subestimado y Cross Site-Scripting y Prevención de la Inyección de Scripts-Una Breve Guía. Sin embargo, este artículo se centra en gran medida en el cross-site scripting basado en DOM, un término acuñado por primera vez en 2005 por Amit Klein. Publicó la definición de cross-site scripting (XSS) basado en DOM y la delineó de otras vulnerabilidades de cross-site scripting. Para entender el scripting entre sitios basado en DOM, primero necesita una comprensión más profunda del DOM.

¿Qué es DOM?

El Modelo de objetos de documento es una interfaz de programa que define la estructura de los documentos. Lo que es relevante para nuestros propósitos es que DOM proporciona la representación orientada a objetos de documentos HTML, específicamente:

  • Cómo se representa un elemento HTML como un objeto
  • Cuáles son los atributos de un elemento HTML
  • Qué métodos se pueden usar para acceder a un elemento HTML
  • Cuáles son los eventos de un elemento HTML

Esto significa que DOM especifica cómo se pueden encontrar, agregar, cambiar o eliminar elementos HTML en el navegador. Eso significa que DOM ofrece una oportunidad para manipular páginas HTML. En estos días, JavaScript se usa generalmente para este tipo de manipulación.

Debe tenerse en cuenta que cada navegador implementa el estándar DOM de manera diferente. Esto puede afectar si un ataque DOM XSS específico funciona en un navegador en particular.

¿Qué es XSS basado en DOM?

Una vulnerabilidad XSS basada en DOM surge cuando el DOM se usa para generar contenido dinámico que contiene entrada de usuario que se puede procesar sin verificar. Este tipo de ataque se realiza con JavaScript en el navegador del usuario. Aquí, las ubicaciones que la entrada de usuario (maliciosa) introduce en el DOM se designan como fuente. Las ubicaciones en las que se puede ejecutar la entrada de usuario (maliciosa) en el DOM se designan como sumidero.

Un ejemplo de vulnerabilidad simple de scripting entre sitios:

<!DOCTYPE html><html> <body> <script> var source = "Hello " + decodeURIComponent(location.hash.split("#")); //Source var divElement = document.createElement("div"); divElement.innerHTML = source; //Sink document.body.appendChild(divElement); </script> </body></html>

La vulnerabilidad puede, por ejemplo, activarse con la siguiente solicitud GET:

GET www.vulnerable-website.example#<img src="test" onerror="alert('XSS')">

Podemos ver que este ejemplo requiere el uso del método decodeURIComponent. Esto se debe a que los navegadores modernos codifican caracteres especiales en la URL y el ataque no funcionaría sin que se decodificaran estos caracteres especiales. El contenido de la variable source se añade al elemento div usando innerHTML. Este es el elemento problemático en el código, porque su asignación a innerHTML hace que el valor incluido con él se interprete como HTML. Si el valor contiene JavaScript, esto también se ejecuta.

Debe señalarse que esto no altera la respuesta del servidor. La modificación maliciosa solo surge cuando el código JavaScript se ejecuta en el lado del cliente, que el DOM posteriormente altera.

A continuación se enumeran las fuentes y sumideros más conocidos. Cabe señalar que no se trata en modo alguno de una lista exhaustiva.

Fuentes

  • documento.URL
  • documento.referencia
  • ubicación
  • ubicación.href
  • ubicación.buscar
  • ubicación.hash
  • ubicación.ruta de acceso

Fregaderos

  • eval
  • setTimeout
  • setInterval
  • documento.escribe el elemento
  • .innerHTML

Evitar XSS basados en DOM

Debido a que hay casos en los que la carga útil nunca llega al servidor, evitar esta vulnerabilidad no es una tarea para el lado del servidor. El ejemplo anterior es uno de esos casos. La razón es que el contenido que aparece después de un carácter # no es enviado por el navegador al servidor.

La primera y más importante recomendación es evitar el uso de datos controlados por el usuario para la generación dinámica de contenido siempre que sea posible. Si esto es completamente inevitable, la mejor manera de evitar XSS basados en DOM es usar métodos de salida seguros (sink) que impidan la ejecución de cualquier código incrustado maliciosamente. En el fragmento de código anterior, la única manera de hacer que el código sea seguro es reemplazar .innerHTML por .textContent. Esto se debe a que, a diferencia de innerHtml, los elementos HTML en el método textContent no se ejecutan.

La hoja de trucos de Prevención XSS basada en DOM de OWASP tiene muchos consejos útiles para desarrollar sitios web dinámicos seguros con JavaScript. Allí también encontrará descripciones de la codificación dependiente del contexto, que se requiere cuando es imposible cambiar a un método de salida seguro.

Diferencias con otras vulnerabilidades XSS

La diferencia más importante es dónde está incrustado el ataque en el código. A diferencia de otras vulnerabilidades de scripting entre sitios, el código no está incrustado en el lado del servidor, sino en el lado del cliente. Esto significa que la carga útil no se puede encontrar en el código de respuesta. Por lo tanto, las vulnerabilidades XSS basadas en DOM solo se pueden detectar en tiempo de ejecución o revisando el DOM del sitio web.

En la mayoría de los casos, encontrar vulnerabilidades XSS basadas en DOM no es fácil. Un enfoque útil que utiliza el enfoque de análisis de código estático se describe en el artículo Burp based-xss.

Sobre el autor

Andrea Hauser

Andrea Hauser se graduó con una licenciatura en Ciencias FHO en tecnología de la información en la Universidad de Ciencias Aplicadas Rapperswil. Está enfocando su trabajo ofensivo en las pruebas de seguridad de aplicaciones web y la realización de campañas de ingeniería social. Su enfoque de investigación es crear y analizar deepfakes. (ORCID 0000-0002-5161-8658)

Enlaces

  • http://www.webappsec.org/projects/articles/071105.html
  • https://support.portswigger.net/customer/portal/articles/2325926-using-burp-scanner-to-test-for-dom
  • https://www.cert.org/historical/advisories/CA-2000-02.cfm
  • https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
  • https://www.w3.org/DOM/

Deja una respuesta

Tu dirección de correo electrónico no será publicada.