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.