In che modo i browser gestiscono document.write in questo caso XSS basato su DOM?

1

OWASP cita il seguente esempio di codice vulnerabile a un attacco XSS basato su 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>

E dicono che può essere attaccato con il seguente URL:

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

Questo mi rende ferito se il browser Web esegue la valutazione di JavaScript due volte? Ad esempio, esegue prima document.write e quindi attiva il codice nell'output visualizzato di seguito, quindi lo esegue di nuovo per eseguire lo script della casella di avviso? Come vengono avviati i parser HTML e JavaScript: paralleli / sequenziali / dall'alto verso il basso / dall'alto verso il basso? Qual è l'ordine che seguono?

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

1 risposta

1

Prima il browser passa i dati in arrivo al parser HTML, che inizia a lavorare dalla parte superiore del documento e in basso. Questo può accadere anche prima che il documento finisca di scaricare. Non appena il parser HTML arriva a un tag di script, passa il contenuto al motore JavaScript che avvia immediatamente l'esecuzione del codice.

Se lo script contiene document.write , scriverà il contenuto nel flusso di documenti da cui l'HTML sta leggendo. Quindi il contenuto finirà subito sotto il tag script che lo ha creato.

Una volta completato il motore di script, il parser HTML continua a analizzare il documento dopo il tag dello script. Lì, la prima cosa che troverà è l'uscita da document.write che sarà felicemente analizzata. Se quell'output contiene un altro tag script, verrà eseguito come qualsiasi altro.

Quindi è solo un passaggio, dall'alto verso il basso, con il passaggio iniziale tra il parser HTML e il motore JS. Oppure, per dirlo con un'immagine ... Sai quella scena di Wallace & Gromit dove Gromit è seduto su un trenino, disponendo i binari davanti a sé mentre avanza veloce? Bene, il treno è il parser HTML, Gromit è il motore JS che fa document.write , e le tracce è il flusso del documento.

Ammetto che si tratta di una semplificazione. Ad esempio, il browser può continuare ad analizzare il documento HTML mentre esegue lo script nella speranza che lo script non utilizzi document.write . E poi c'è anche l'HTML5 async e defer .

    
risposta data 11.05.2018 - 11:00
fonte

Leggi altre domande sui tag