¿En qué situaciones puede element.setAttribute permitir XSS?

9

Burp ha identificado una vulnerabilidad potencial de DOM XSS:

  

La aplicación puede ser vulnerable a los scripts entre sitios basados en DOM. Los datos se leen desde window.location.href y se pasan a la función 'setAttribute ()' de un elemento DOM

En este ejemplo, el código vulnerable es similar (no puedo incluir el original real para confidencialidad):

var thing = windows.location.href;
...
element.setAttribute("fill", thing);

La OWASP DOM XSS Cheat Sheet dice "Escape de JavaScript antes de insertar datos no confiables en el texto secundario del atributo HTML dentro de la ejecución Contexto". No estoy muy seguro de lo que significan por contexto de ejecución.

Al hacer algunas pruebas rápidas (en Chrome), esto es vulnerable:

document.getElementById("bob").setAttribute("onclick", "alert(1)");

Pero esto no es:

document.getElementById("bob").setAttribute("fill", "" onclick="alert(1)");

Dado todo eso, siento que Burp ha reportado un falso positivo. Pero me preocupa que me haya perdido algo, por lo que se agradecería recibir más información.

Solo me interesa si esto es explotable en navegadores recientes. No estoy interesado en "no es la mejor práctica" o "explotable en IE 4 en una Mac".

    
pregunta paj28 14.10.2016 - 11:30
fuente

1 respuesta

5

setAttribute() es seguro porque no hace nada más que establecer el valor del atributo. Incluso al utilizar caracteres especiales en la cadena, no puede inyectar un atributo adicional (como intentó en su tercer fragmento), y mucho menos escapar de la etiqueta HTML.

Algunos atributos son peligrosos para algunos . Como demostró, los atributos on* son vulnerables porque le permiten especificar controladores de eventos de script. De forma similar, src y srcdoc son peligrosos en los elementos <iframe> , etc.

La técnica de inyectar JS a través de url() según lo propuesto por @Anders ha funcionado anteriormente para los atributos CSS pero ya no es posible en los principales navegadores. En ese entonces, una carga útil como <rect fill="url('javascript:alert(1)')"/> podría haber funcionado. Esa también podría ser la razón por la que Burp lo señala como una vulnerabilidad potencial. Sin embargo, no es un vector de ataque en los navegadores recientes.

    
respondido por el Arminius 16.10.2016 - 02:43
fuente

Lea otras preguntas en las etiquetas