Vettori XSS che funzionano senza parentesi di chiusura?

3

Ho trovato una vulnerabilità XSS riflessa che analizza il codice HTML, ma se inserisci una parentesi di chiusura il filtro lo elimina.

Esiste un codice per una dimostrazione del concetto che possa essere eseguito senza parentesi di chiusura (>)?

Grazie

    
posta Jack 17.01.2017 - 14:17
fonte

3 risposte

1

Is there any code for a proof of concept that I can run without any closing brackets (>)?

No, i tag regolari non funzionano senza una parentesi di chiusura. Tuttavia, puoi utilizzare i commenti.

Se il tokenizer del tuo browser è conforme alla specifica della sintassi HTML W3C (quali browser moderni dovrebbero fare), non emetterà un token di tag a meno che non forniate una parentesi di chiusura ( > ). Puoi confermare questo cercando le transizioni di stato in il tokenizzatore .

Di ', inietti <script che significa che ora sei Stato nome tag . Ecco le tue opzioni:

8.2.4.10 Tag name state

Consume the next input character:

"tab" (U+0009)
"LF" (U+000A)
"FF" (U+000C)
U+0020 SPACE
    Switch to the before attribute name state.
"/" (U+002F)
    Switch to the self-closing start tag state.
">" (U+003E)
    Switch to the data state. Emit the current tag token.
Uppercase ASCII letter
    Append the lowercase version of the current input character (add 0x0020 to the character's code point) to the current tag token's tag name.
U+0000 NULL
    Parse error. Append a U+FFFD REPLACEMENT CHARACTER character to the current tag token's tag name.
EOF
    Parse error. Switch to the data state. Reconsume the EOF character.
Anything else
    Append the current input character to the current tag token's tag name. 

Solo > emette il token del tag, ma non ti è consentito utilizzarlo. Se il documento finisce proprio lì ( EOF ), stai producendo un errore di analisi e non emettendo il token. Un'eccezione a tale comportamento sono i commenti e le dichiarazioni DOCTYPE.

Ora diciamo di entrare nello stato dei commenti tramite <!-- . Quindi queste sono le opzioni:

8.2.4.48 Comment state

Consume the next input character:

"-" (U+002D)
    Switch to the comment end dash state
U+0000 NULL
    Parse error. Append a U+FFFD REPLACEMENT CHARACTER character to the comment token's data.
EOF
    Parse error. Switch to the data state. Emit the comment token. Reconsume the EOF character.
Anything else
    Append the current input character to the comment token's data. 

Come puoi vedere, un end-of-file emette ancora il token del commento. Quindi, anche se non è possibile chiudere un tag, è possibile inserire un commento che commenta il seguente testo. Inoltre, verranno emessi token DOCTYPE ( <!DOCTYPE ) e sostanzialmente qualsiasi cosa che inizi con <! .

Ovviamente, se il tuo punto di iniezione è circondato da tag HTML, non devi chiudere tu stesso il tag poiché verrà applicato qualsiasi > successivo e lo farà per te. @tim ha dato un esempio per questo nella sua risposta.

    
risposta data 18.01.2017 - 01:44
fonte
1

Dipende dal resto della pagina. Se contiene una parentesi di chiusura, puoi probabilmente usarla per chiudere qualsiasi tag che hai aperto.

Un esempio potrebbe essere:

<img src=no onerror=alert(1) foo=       // the input
<div>example</div>                      // the rest of the page

Quale sarebbe eseguito almeno da Chrome e Firefox.

    
risposta data 17.01.2017 - 23:20
fonte
1

Le seguenti iniezioni XSS verranno eseguite senza alcun tag di chiusura di accompagnamento.

<body/onload=alert(1) <svg/onload=alert(1) <iframe/onload=alert(1)

Per quanto riguarda perché questo accade, non sono sicuro. Qualcun altro potrebbe essere in grado di rispondere, ma funziona.

Esempio di violino: link

    
risposta data 18.01.2017 - 05:04
fonte

Leggi altre domande sui tag