¿Cómo manejan los navegadores document.write en este caso XSS basado en DOM?

1

OWASP menciona el siguiente ejemplo de código vulnerable a un ataque XSS basado en DOM:

Select your language:    
<select><script>    
document.write("<OPTION value=1>"+document.location.href.substring(document.location.href.indexOf("default=")+8)+"</OPTION>");    
document.write("<OPTION value=2>English</OPTION>");    
</script></select>

Y dicen que se puede atacar con la siguiente URL:

http://www.some.site/page.html?default=<script>alert(document.cookie)</script>

¿Esto me hace más extraño si el navegador web realiza una evaluación de JavaScript dos veces? Es decir, ¿se ejecuta primero el document.write y luego convierte el código en la salida que se muestra a continuación, y luego lo ejecuta nuevamente para ejecutar el script del cuadro de alerta? ¿Cómo se activan los analizadores HTML y JavaScript - paralelo / secuencial / arriba abajo / abajo arriba? ¿Cuál es el orden que siguen?

Select your language:
<select>
<OPTION value=1><script>alert(document.cookie)</script></OPTION>
<OPTION value=2>English</OPTION>
</select>
    
pregunta Anders 11.05.2018 - 01:12
fuente

1 respuesta

1

Primero, el navegador entrega los datos entrantes al analizador HTML, que comienza a funcionar desde la parte superior del documento y hacia abajo. Esto puede suceder incluso antes de que el documento haya finalizado la descarga. Tan pronto como el analizador HTML llega a una etiqueta de secuencia de comandos, transfiere el contenido al motor de JavaScript que comienza a ejecutar el código de inmediato.

Si la secuencia de comandos contiene document.write , escribirá contenido en el flujo de documentos desde el que se lee el HTML. Por lo tanto, el contenido terminará justo debajo de la etiqueta de script que lo creó.

Cuando se termina el motor de secuencias de comandos, el analizador HTML continúa analizando el documento después de la etiqueta de secuencia de comandos. Allí, lo primero que encontrará es la salida de document.write que analizará felizmente. Si esa salida contiene otra etiqueta de script, se ejecutará como cualquier otra.

Así que solo es una pasada, de arriba abajo, con el cambio inicial entre el analizador HTML y el motor JS. O, para decirlo con una imagen ... Ya sabes esa escena de Wallace & ¿Gromit donde Gromit está sentado encima de un tren de juguete, colocando las vías delante de él a medida que avanza? Bueno, el tren es el analizador de HTML, Gromit es el motor JS que hace document.write y las pistas son el flujo de documentos.

Admito que esto es un poco simplificado. Por ejemplo, el navegador puede continuar analizando el documento HTML mientras ejecuta la secuencia de comandos con la esperanza de que la secuencia de comandos no use document.write . Y luego también están HTML5 async y defer .

    
respondido por el Anders 11.05.2018 - 11:00
fuente

Lea otras preguntas en las etiquetas