¿Por qué los scripts inyectados a través de innerHTML no se ejecutan mientras que onerror y otros atributos de eventos en los elementos sí? - Google XSS Challenge 2

5

ALERTA DE SPOILER: no continúes si no quieres que te echen a perder

Actualmente estoy haciendo el Nivel 2 del desafío XSS de Google .

Estoy inyectando el código XSS que se inserta en el documento usando element.innerHTML . No entiendo por qué <script>alert("Foobar")</script> no funciona, pero <img src="/" onerror = "alert(1);" funciona.

He intentado buscar en el código fuente pero aún no entiendo por qué. Soy nuevo en XSS, por lo que le agradecería que hiciera referencia al código fuente al formular sus respuestas.

    
pregunta Computernerd 12.06.2014 - 06:09
fuente

2 respuestas

2

Los scripts inyectados en el DOM a través de las etiquetas de script en innerHTML no se ejecutan en el momento en que se inyectan (los scripts en línea se ejecutan en el momento en que se analiza la página original). Por otro lado, las imágenes inyectadas en el DOM se cargan en ese momento, y si la carga falla, se llama al controlador de eventos onerror.

    
respondido por el David 12.06.2014 - 06:11
fuente
2

La respuesta a eso depende de la forma en que el navegador ejecuta los scripts presentes en diferentes lugares dentro de una página. Por ejemplo:

  • JavaScript dentro de las etiquetas de script en línea se procesa de forma sincrónica con las otras marcas en la página web. Estas etiquetas de script pueden ralentizar el procesamiento de una página web.
  • Las etiquetas de script que se asignan a los elementos después de las cargas de DOM (como en el caso del desafío 2) en realidad nunca se ejecutan en la mayoría de los casos ( vea Excepción al final de la respuesta ).
  • JavaScript dentro de un controlador de eventos como atributo se ejecuta tan pronto como ocurre un evento en particular (por lo que las entradas como <img src="/" onerror = "alert(1);" y <body onload="alert(2)"></body> funcionarán en este caso).

EXCEPTION:

Las etiquetas de script con un atributo defer no se ejecutarán (en algunos navegadores) hasta que el DOM se haya procesado por completo. Por ejemplo, intenté el mismo desafío en IE y pude alertar a una ventana emergente usando la siguiente entrada del usuario:

<script defer>alert(2)</script>
    
respondido por el Rahil Arora 12.06.2014 - 19:46
fuente

Lea otras preguntas en las etiquetas