Come posso sfruttare una vulnerabilità XSS che non mi consente di digitare e simboli e inserisce il mio input tra virgolette doppie?

0

Ho il seguente script:

function filter() {
    const inputstring = JSON.stringify(document.getElementById('input').value)
        .replace(/[<]/g, '%lt')
        .replace(/[>]/g, '%gt');
    const userTemplate = '<script>let a = %userData%</script>';
    document.write(userTemplate.replace(/%userData%/, inputstring));
}

Prima di tutto, legge la stringa inviata con l'aiuto dell'input HTML. Quindi analizza la stringa per i simboli < e > . Se vengono trovati, vengono sostituiti. Quindi, sostituisce %userData% con il nostro input e lo scrive.

Come posso ignorare questo filtro e sfruttare XSS qui? La riga <script>let a = %userData%</script> sembra abbastanza interessante in quanto contiene già un tag script e una variabile a . È anche abbastanza inutile usare > e < simboli in input, quindi suppongo che siamo costretti a usare la variabile a . Il problema è che tutto il mio input viene circondato da virgolette doppie (il risultato è <script>let some = "text"</script> quando il mio input è testo), quindi non posso eseguire alcuna funzione. Forse è in qualche modo possibile sbarazzarsi delle virgolette?

    
posta can300 12.11.2018 - 19:49
fonte

3 risposte

-1

In base allo snippet di codice, sembra che la protezione stia semplicemente utilizzando JavaScript sul lato client per la protezione da XSS. Tutto quello che dovresti fare è aprire la console su quella pagina e ridefinire il metodo di filtro. Spero davvero che la protezione XSS non venga eseguita dal lato client o che si tratti di un CTF.

    
risposta data 13.11.2018 - 10:21
fonte
2

Sì, questo filtro può essere aggirato giocando con modelli di sostituzione speciali .

$'$'alert(1)//

L'output del payload sopra sembrerà qualcosa di simile:

</script><script>let a = "</script><script>let a = alert(1)//"</script>

Se sei interessato a saperne di più su tecniche di bypass simili, ti consiglio vivamente di dare link a go.

    
risposta data 26.11.2018 - 20:57
fonte
0

Non riesco a trovare alcun modo diretto per sfruttare questo filtro. Tuttavia, non dovresti mai sentirti sicuro con un filtro XSS homebrew come quello. E potrebbero esserci modi indiretti .

La proprietà value di un elemento HTML sarà sempre una stringa. Quindi JSON.stringify scappa e racchiude tra virgolette. Posso pensare a tre modi per uscire dal contesto della stringa JS, ma nessuno di essi funziona:

  • Con un tag script o un commento HTML: la sostituzione di < e > ci ferma qui.
  • Con una virgoletta doppia: vengono sottoposti a escape durante la codifica JSON.
  • Con una nuova riga: viene anche sfuggito durante la codifica JSON.

Quindi andrei alla ricerca di modi indiretti per sfruttarlo. Cosa succede alla variabile a ? Viene inserito nel DOM da qualche parte? Ad esempio, se trovi codice come questo, sarai in grado di sfruttarlo:

element.innerHTML = '<img src='${a}'>';
    
risposta data 14.11.2018 - 10:31
fonte

Leggi altre domande sui tag