Come violare Filtri XSS




Oggi vi mostro una guida presa da cyphersec e ve la riporto pari pari a come l’autore la descrive.

Quando si parte ad eseguire controlli e verifiche su applicativi importanti è necessario prestare la massima attenzione a quello che si sta facendo. Spesso c’imbattiamo in sistemi atti a prevenire ed evitare vulnerabilità di varie classi. La maggior parte di essi si compongono di sistemi “d’alterazione” e/o “pulizia” dell’input ricevuto. Facciamo un esempio, parliamo di Filtri XSS.

Per quanto abbiamo visto nei precedenti post e/o in tutti le rilevazioni di vulnerabilità XSS, il codice classico di esempio è:

<script>alert("Questo è un alert che dimostra vulnerabilità XSS")</script>

Nel caso in cui questo messaggio non si verifichi, considerare l’applicazione sicura è decisamente errato. Perchè? Nel primo caso è necessaio verificare come l’applicativo sta “digerendo” il nostro codice. Di media sono necessari pochi secondi per capire dove e cosa stiamo sbagliando.
Un esempio classico può essere

<INPUT type="text" value='<SCRIPT>alert("XSS")</SCRIPT>'>

Cosa sia necessario fare è piuttosto chiaro. Dobbiamo chiudere il tag input senza dimenticarci di chiudere la proprietà value. In questo modo il nostro “payload” viene craftato nel seguente modo:

'><script>alert('XSS')</script>

il quale di fatto verrà verificato come codice corretto. E quindi visualizzato a video. Avanza un problema però. Inserendo questo payload resteranno eclusi dalla renderizzazione due caratteri ‘>. Questo è dovuto dal fatto che il codice verrà trasformato in

<input type="text value =''><script>alert('XSS')</script>'>

Ora, non nel nostro caso: gli attacchi XSS vengono condotti per scopi ben più che differenti che da quelli legali. Pertanto, un paio di caratteri renderizzati a video privi di senso potrebbero destare sospetti. Soluzione? Creare un tag inesistente.
Payload:

'><script>alert('Questa volta funziona')</script><miotag='a

Codice generato

<input type="text value =''><script>alert('Questa volta funziona')</script><miotag='a'>

miotag è spudoratamente inventato, ma non essendo un tag valido.. non verrà renderizzato a video. Ma entriamo nel vivo dell’argomento ed affrontiamo i più banali filtri xss.
Consideriamo il fatto che i programmatori del sito che stiamo analizzando hanno inserito il classico sistema di sostituzione e duplicazione di single e double quote ‘ “. Il nostro payload a questo punto verrebbe renderizzato come

<INPUT type="text" value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>

Naturalmente questo codice non funzionerà mai. Dopo esserci accertati di avere a che fare con questo tipo di filtro, l’unica soluzione possibile è quella di smettere di lavorare con i double\singles quotes.

Ora molti di voi si chiederanno:

“Ma come faccio a non utilizzare i double quotes?”
Risposta : String.fromCharCode,

Cercando rapidamente su w3schools scopriamo che: The fromCharCode() takes the specified Unicode values and returns a string.

Con i valori di una tabella decimale alla mano, possiamo andare a scrivere tranquillamente i nostri amati double quotes. Ecco un esempio (renderizza a video “XSS”)

   1: <script type="text/javascript">
   2: document.write(String.fromCharCode(34,88,83,83,34))
   3: </script>

stando a quanto abbiamo detto fin ora, per eludere completamente questo filtro XSS è necessario scrivere del codice simile a quello che segue.

   1: <SCRIPT>
   2: alert(String.fromCharCode(88,83,83))
   3: </SCRIPT>