Perché gli script iniettati tramite innerHTML non vengono eseguiti mentre onerror e altri attributi onevent sugli elementi sono? - Google XSS Challenge 2

6

AVVISO SPOILER: non continuare se non vuoi essere rovinato

Attualmente sto facendo Sfida Google XSS livello 2 .

Sto iniettando il codice XSS che viene inserito nel documento usando element.innerHTML . Non capisco perché <script>alert("Foobar")</script> non funzioni ma <img src="/" onerror = "alert(1);" funziona.

Ho provato a guardare il codice sorgente ma non riesco ancora a capire perché. Sono nuovo di XSS, quindi sarei grato se faresti riferimento al codice sorgente quando formulerai le tue risposte.

    
posta Computernerd 12.06.2014 - 06:09
fonte

2 risposte

3

La risposta a questo dipende dal modo in cui il browser esegue gli script presenti in diversi posti all'interno di una pagina. Ad esempio:

  • JavaScript all'interno dei tag script in linea viene elaborato in modo sincrono con gli altri markup nella pagina web. Questi tag di script potrebbero rallentare l'elaborazione di una pagina Web.
  • I tag script assegnati agli elementi dopo il caricamento DOM (come nel caso della challenge 2) non vengono mai eseguiti nella maggior parte dei casi ( vedi Eccezione alla fine della risposta )!
  • JavaScript all'interno di un gestore di eventi poiché un attributo viene eseguito non appena si verifica un determinato evento (motivo per cui input come <img src="/" onerror = "alert(1);" e <body onload="alert(2)"></body> funzioneranno in questo caso).

ECCEZIONE:

I tag script con un attributo defer non verranno eseguiti (su alcuni browser) fino a quando il DOM non sarà stato completamente renderizzato. Ad esempio, ho provato la stessa sfida su IE e sono stato in grado di avvisare un popup utilizzando il seguente input utente:

<script defer>alert(2)</script>
    
risposta data 12.06.2014 - 19:46
fonte
2

Gli script iniettati nel DOM tramite tag di script in innerHTML non vengono eseguiti al momento dell'iniezione (gli script inline vengono eseguiti nel momento in cui viene analizzata la pagina originale). D'altra parte, le immagini iniettate nel DOM vengono caricate in quel momento e, se il caricamento fallisce, viene chiamato il gestore di eventi onerror.

    
risposta data 12.06.2014 - 06:11
fonte

Leggi altre domande sui tag