Secuestro de trabajadores de servicios a través de DOM Clobbering
En este artículo, veremos brevemente cómo funciona el secuestro del trabajador del servicio y luego presentaremos una variante que, gracias a una peculiaridad, puede activarse por la congestión del DOM. document.getElementById()
.
Comprender a los trabajadores de servicios
Muchos sitios web utilizan trabajadores de servicio (SW) para proporcionar capacidades de almacenamiento en caché y fuera de línea. Las páginas web a menudo pasan información a los trabajadores del servicio utilizando parámetros de solicitud porque los SW no tienen acceso al DOM de la página del host. Si estas configuraciones se manejan de manera insegura, puede llevar a la ejecución de JavaScript malicioso dentro del SW. “Exploración de la seguridad de las secuencias de comandos entre sitios de los trabajadores de servicio” papel. Aunque es poco común, esta vulnerabilidad tiene un mayor impacto que el XSS típico porque permite el secuestro persistente del sitio del lado del cliente.
Secuestro de trabajadores de servicios
Este método de secuestro de un trabajador de servicio permite tres resultados principales:
- Evite el filtrado HTML
- derivación CSP
- XSS aumentado
los importScripts()
La función está en el corazón de esta vulnerabilidad: permite que SW obtenga JavaScript de otro dominio. En el siguiente ejemplo, un atacante puede controlar el parámetro de solicitud del host, lo que puede generar un control total sobre el script importado y, por lo tanto, un control total sobre las respuestas del sitio web.
Para explotar tales vulnerabilidades, necesita dos componentes:
- Uno: control del parámetro de cadena de consulta pasado al SW.
- Dos uno
importScripts()
una llamada de función dentro de SW que puede verse afectada por un parámetro de cadena de consulta.
índice.html:
sw.js:
const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker
Usando este conocimiento, buscamos errores usando Puppeteer y Invasor DOM
Escaneamos muchos sitios de recompensas de errores y encontramos uno que usaba SW dentro de un iframe: estaban pasando parámetros de URL del documento del marco al SW. DOM Invader notó inmediatamente este comportamiento, pero afortunadamente para el sitio, no permitieron inyectar SW desde la ventana de nivel superior. El código se veía así:
navigator.serviceWorker.register('https://redacted&_flasher_manifest_=https://redacted/@xconfig/flasher_classic/manifestysvoy7p7location.href')
DOM Invader luego generó un token aleatorio dentro del recurso location.href que se pasó serviceWorker.register()
hundir Este comportamiento se informó más tarde en el DOM extendido. Configuramos DOM Invader para inyectar automáticamente el canary en todas las fuentes, pero eso no ayudó mucho. Así que decidimos adoptar un enfoque diferente: ¿qué pasaría si buscáramos todos los registros de trabajadores de servicios utilizando parámetros de consulta? Esto identificará los SW potencialmente vulnerables, pero requerirá una mayor investigación para ver si pueden ser explotados, lo que condujo a un descubrimiento interesante…
Adulación del trabajador de servicio
Descubrimos que pasar los datos del sitio web principal al script SW
innerText
a
Elemento con id “cdnDomain”:
Esto es malo porque si puedes usarlo Golpe de DOM puede obtener control sobre el dominio SW para capturar la variable. De hecho, esto es ligeramente diferente de un ataque DOM Clobbering normal porque se usa código document.getElementById()
y innerText
. Si puede insertar un elemento HTML primero
elemento, puede controlar el dominio CDN; esto significa que puede controlar el contenido del script SW. Esto puede resultar en eludir el filtro HTML o eludir el CSP en control total de las respuestas del sitio web. XSS reflectante. Así es como se ve el código:
Luego, usando el método de registro SW pasando este dominio:
/sw?cdnDomain=ejemplo.com
Luego, el propio SW usó el dominio para cargar algunos scripts:
importScripts(`${n}/versionless/workbox-v${s.e}/workbox-sw.js`)
Al principio pensamos que para usar el div cdnDomain necesitarías un elemento antes, pero descubrimos que este no es necesariamente el caso. Puedes adivinar los resultados. document.getElementById()
llama si tienes una aguja
o
etiqueta con el mismo atributo id. Aquí hay un ejemplo:
clobbered
Lo bueno es que puedes ocultar elementos innerText
por lo tanto, si inserta una etiqueta HTML/cuerpo, puede usar estilos para ocultarla innerText
para evitar que otro texto interfiera con su ataque:
existing text
clobbered
También miramos SVG y es posible usarlo
etiqueta allí:
Lo necesita
etiqueta para usar la etiqueta HTML dentro del SVG tanto en Chrome como en Firefox:
Detección de inyección de trabajador de servicio con DOM Invader
Para encontrar la inyección de SW, solo necesita poner un valor controlado en la cadena de consulta o configurar DOM Invader. inyectar el canario en todas las fuentes. Luego, si DOM Invader detecta una llamada de función confidencial, mostrará un nuevo receptor llamado “serviceWorker.register”:

Creamos caso de prueba demuestra este problema. Tenga en cuenta que esto solo registra la cadena de consulta que se pasa al SW, se requiere más investigación para ver si esta cadena de consulta se analiza y luego se usa con algo similar. importScripts()
Dentro del SO.
DOM Invader puede ayudarlo a encontrar la inyección SW manipulando la cadena de consulta. Sin embargo, en casos más complejos o cadenas de errores, es posible que desee configurar DOM Invader para tener un canary vacío para mostrarle solo los registros de SW y ver todas las llamadas a él. Puede hacer esto yendo a la configuración e ingresando un canario vacío, luego haciendo clic en el botón “actualizar canario”. Si solo desea ver los registros de SW, haga clic nuevamente en la configuración, luego en la rueda de configuración general (DOM Invader está habilitado), luego desplácese hacia abajo y seleccione ninguno. Luego busque serviceWorker.register y actívelo, le mostrará todos los registros de SW. También puedes usar llamar de vuelta para buscar signos de interrogación en el valor del zinc.
Puede usar la última versión para encontrar tales vulnerabilidades usted mismo Burp Suite está actualmente disponible en el canal de primeros usuarios. Si lo prueba, y especialmente si encuentra algún ejemplo de inyección SW, háganoslo saber, nos encantaría me encantan tus comentarios.