Perché questo vettore XSS funziona in svg ma non in HTML?

16

Perché questo vettore:

<svg><script>alert&#40/1/.source&#41</script>

funziona in link e questo

<script>alert&#40/1/.source&#41</script>

non lo fa. In che modo <svg> lo fa funzionare?

    
posta Daniel 30.05.2013 - 21:47
fonte

2 risposte

21

HTML <script> ha poteri speciali che altri elementi non hanno: è un "elemento CDATA". Ciò significa che qualsiasi carattere < o & fino alla fine dell'elemento viene preso come significato letterale di quei caratteri. Quindi, ciò che viene passato all'interprete JS è:

alert&#40/1/.source&#41

che ovviamente non è una sintassi JS valida.

Il concetto di un "elemento CDATA" deriva dal mondo SGML da cui è sviluppato HTML. Ma SVG viene dal mondo XML in cui le cose sono semplificate e non ci sono elementi CDATA. Di conseguenza l'elemento SVG <script> non ha poteri speciali: all'interno di uno script SVG, < introduce un tag e & introduce un riferimento a entità o carattere.

Di conseguenza &#40 viene analizzato in ( e la stringa risultante passata all'interprete JS è:

alert(/1/.source)

Nei termini XML l'elemento <script> si trova nello spazio dei nomi HTML e l'elemento <svg><script> si trova nello spazio dei nomi SVG, quindi sono elementi diversi. HTML5 rende tutto ciò meno chiaro nascondendo i prefissi dello spazio dei nomi e applicando un parser non XML all'SVG (che è il motivo per cui &#40 funziona nonostante non sia ben formato, dovrebbe essere &#40; ).

    
risposta data 31.05.2013 - 11:37
fonte
3

Il # (hash, sharp, pound) interrompe il tuo Javascript. All'interno di una coppia di tag <svg> (il tag di chiusura non viene fornito) il numero dell'entità viene convertito nel riferimento di carattere appropriato quando viene visualizzato come html, quindi il motore esegue Script ECMA (che è permesso fare per disegnare) .

OWASP.org lo documenta come codifica esadecimale senza punto e virgola .

    
risposta data 31.05.2013 - 01:21
fonte

Leggi altre domande sui tag