¿Es este uso de códigos de document.location.toString () una vulnerabilidad XSS basada en DOM?

5

He encontrado el siguiente código JS en varias aplicaciones web. Creo que la razón de la popularidad de este fragmento de código es esta respuesta aceptada en SO . Los desarrolladores parecen estar usando este código muchas veces para cambiar las pestañas del menú:

var url = document.location.toString();
if (url.match('#')) {
    $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
}

Básicamente, lee desde document.location y pasa cualquier cosa después de # a $() sin ningún tipo de saneamiento.

Incluso el escáner activo de Burp Suite lo reporta como un verdadero positivo.

He intentado explotarlo, pero me parece un falso positivo. Mi hipótesis es que, dado que JS está convirtiendo la URL como una cadena, cualquier carga útil (incluyendo caracteres especiales) se tratará como una cadena.

¿Publicar esto aquí solo para asegurarse de que si pueden pensar en otra forma de explotarlo para causar un XSS basado en DOM?

    
pregunta Rahil Arora 24.05.2016 - 20:33
fuente

2 respuestas

4

Este fragmento de código es vulnerable a XSS en jQuery antes de la versión 1.9 (y junto con el complemento jQuery Migrate). Incluso ahora, sigue siendo al menos una mala práctica.

El argumento de cadena para $() (acceso directo para jQuery() ) se puede analizar como un selector de CSS o un código HTML. Analizar la cadena como HTML implica una vulnerabilidad XSS, tal como lo haría document.write() . Por otro lado, la inyección en un selector de CSS no se puede explotar directamente en los navegadores actuales.

El changelog para v1.9 explica cómo cambiaron el análisis comportamiento:

  

Antes de 1.9, una cadena se consideraría una cadena HTML si   tenía etiquetas HTML en cualquier lugar dentro de la cadena. Esto tiene el potencial de   provocar la ejecución involuntaria de código y rechazar cadenas de selector válidas.   A partir de 1.9, una cadena solo se considera HTML si comienza con un   carácter menor que ("<"). El complemento Migrate se puede utilizar para restaurar   el comportamiento pre-1.9.

Como la cadena de su fragmento ( '.nav-tabs a[href="#' + <payload> + '"]' ) no comienza con un < , no podrá inyectar su propio código, cuando la página esté ejecutando una versión actual de jQuery.

Sin embargo, aún debe desinfectar la salida. A veces, diferentes módulos (por ejemplo, complementos de Wordpress) vienen con su propia biblioteca jQuery que podría invalidar inadvertidamente la versión más reciente y reintroducir el comportamiento heredado. Una solución simple sería rechazar la cadena si location.hash no es alfanumérico o no está incluido en una lista de enlaces predefinidos.

    
respondido por el Arminius 24.05.2016 - 23:00
fuente
1

Este fue un vector de ataque XSS bastante común en jQuery, y aún puede afectar a los sitios usando una versión obsoleta de jQuery.

enlace

Básicamente, si una cadena fuera un selector no válido, jQuery supondría que era HTML y lo analizaría como HTML. En jQuery versión 1.9 jQuery mitigó este riesgo al solo analizar una cadena como HTML si comenzó con < , entonces no debería ser posible en jQuery moderno.

Desafortunadamente, muchos sitios todavía usan versiones obsoletas de jQuery (incluido Stack Exchange), que habilitó el ataque WordPress XSS semi-reciente debido a un error en un archivo HTML para su biblioteca de iconos de fuente.

    
respondido por el Alexander O'Mara 24.05.2016 - 23:00
fuente

Lea otras preguntas en las etiquetas