XSS tra tag quando solo e sono codificati? [duplicare]

2

Diciamo che abbiamo <span></span> . Il nostro sito web prende il valore di un parametro di query e lo aggiunge tra i tag, quindi abbiamo <span>Hello!</span> .

Se sanitizziamo il parametro sostituendo < con &lt; e > con &gt , XSS è ancora possibile nel caso in cui i dati non affidabili siano inseriti tra tag HTML?

Ho visto esempi di varie codifiche dispari funzionanti ma non nei browser moderni

    
posta pee2pee 20.04.2016 - 17:21
fonte

1 risposta

4

Se filtri solo tag di script, sì.

Ad esempio:

<img src="x" onerror="alert(1)" />

o

<div style="position: absolute; top: 0; left: 0; width: 9999px; height: 9999px; z-index: 9999" onmouseenter="alert(1)"></div>

O un numero infinito di altri vettori.

Devi filtrare correttamente l'intero contenuto quando li scrivi nella pagina, utilizzando qualsiasi funzione di codifica appropriata per la codifica dell'output (ad esempio HTML, XML, JSON, ecc.) e disponibile nella lingua che stai utilizzando .

Esempi per varie lingue:

Raccomando anche di leggere il foglio trucchi XSS Prevenzione .

EDIT: dopo l'aggiornamento, sì, questo è ancora possibile.

Immagina di filtrare < e > , ma poi inserisci il contenuto in un attributo:

<span class="$class">

Posso quindi utilizzare questo payload:

" style="display: block; position: absolute; top: 0; left: 0; width: 9999px; height: 9999px; z-index: 9999" onmouseenter="alert(1)" foo="

Questo trasforma lo span in un elemento di blocco che riempie l'intera pagina, eseguendo l'evento onmouseenter non appena il mouse dell'utente entra nella pagina.

Ok, quindi non sei ancora convinto.

Le persone hanno impiegato molto tempo a far funzionare XSS in tutti i tipi di semplici ambienti basati su filtri. Il numero di trucchi è sbalorditivo, entrare in ogni sorta di follia come ingannare il browser per interpretare erroneamente la pagina con una codifica di caratteri diversa in modo che UTF-8 o altri codepoint Unicode inviati come input in seguito vengano trattati come codepoint ASCII distinti contenenti HTML che influiscono caratteri come > o " .

Ad esempio, supponiamo che tu stia usando UTF-8 come set di caratteri sul tuo server. Inserisco il carattere 㱁 nella tua pagina, ma poi attraverso vari trucchi (questo è dipendente dal browser e complicato, ma può essere raggiunto banalmente se hai un bug che divide l'intestazione sul tuo server) ingannare il tuo browser assumendo che la codifica sia semplice ASCII. Il codice UTF-8 per 㱁 è U + 3C41, che quando interpretato come ASCII è semplicemente <A . Il tuo browser vede questo come l'apertura di un tag.

Carico utile di esempio:

㱁 href="x" style="display: block; ..." onmouseenter="alert(1)"㸠foo

L'enorme numero di insidie rende impossibile gestirti. hai bisogno di una corretta libreria di filtraggio XSS che sia in grado di riconoscere la codifica per tenere conto di questi problemi.

    
risposta data 20.04.2016 - 17:31
fonte

Leggi altre domande sui tag