Scenario di attacco
- L'attaccante individua la vulnerabilità XSS in un sito web utilizzato dalla vittima, ad esempio il sito di una banca.
- La vittima è attualmente collegata a questa pagina
- L'aggressore invia alla vittima un URL modificato.
- La vittima clicca sull'URL
- Sulla vittima banca sito web, JavaScript codice inizia ad essere eseguito per intercettare l'accesso dell'utente al file dati o eseguire un trasferimento per suo conto sul conto dell'aggressore
Vale la pena di notare che le operazioni eseguite per conto della vittima possono essere invisibili a quest'ultima, in quanto possono avvenire in background utilizzando le risorse della banca. API, oppure l'attaccante può eseguirli in un secondo momento con i dati necessari per l'autenticazione, i token, i cookie, ecc.
Tipi di XSS
1. XSS riflesso
È quello in cui il codice HTML/JavaScript contenuto in qualsiasi parametro (ad esempio GET, POST o cookie) viene visualizzato nella risposta.
Una pagina con un input di testo per cercare qualcosa che metta il parametro ricerca=focaccia nell'URL finale quando si interroga l'API. Dopo aver inserito una frase, se non viene trovata, viene inserito un messaggio di ritorno in HTML ex.
<div>Nessun risultato trovato per <b>pippo</b></div>
Possiamo provare a inserire l'URL search=..
2.DOM XSS
Ciò avviene quando la sua esecuzione è abilitata dall'uso di funzioni pericolose nell'JavaScript, come ad esempio `eval` o `innerHtml`. L'"esempio dal vivo" qui sotto mostra un attacco DOM XSS basato sull'elemento `innerHtml` funzione.
3. XSS memorizzato
Si tratta di un caso in cui il codice dannoso viene scritto sul lato server. Ad esempio, possiamo inviare un commento con codice dannoso a un post del blog che viene caricato sul server. Il suo compito è, ad esempio, quello di attendere la moderazione dell'amministratore e poi di rubare i dati della sua sessione, ecc.
Metodi di iniezione
1. Nel contenuto del tag
`onerror=alert('XSS')`in
<img src onerror="alert('XSS')" />
2. Nel contenuto dell'attributo
`" onmouseover=alert('XSS')` in
<div class="" onmouseover="alert('XSS')""></div>
- Nel contenuto dell'attributo senza le virgolette
x onclick=avviso('XSS')in
<div class="x" onclick="alert('XSS')"></div>
- Nel
hrefattributo ef
javascript:alert('XSS') in
<a href="javascript:alert('XSS')"></a>
- Nella stringa all'interno del codice JavaScript
";alert('XSS')// in
<script>let username="";alert('XSS')//";</script>
- Nell'attributo con l'evento JavaScript
');alert('XSS')// dove ' è una citazione singola, in
<div onclick="change('');alert('XSS')//')">Giovanni</div>
- Nel
hrefall'interno del protocollo JavaScript
);alert(1)// dove %27 è una citazione singola, in
<a href="javascript:change('%27);alert(1)//')">clicca</a>
Esempio dal vivo
Metodi di difesa
- Codifica dei dati utilizzando le funzioni incorporate presenti in molte linguaggi di programmazione.
- Utilizzo di sistemi di template con codifica automatica. La maggior parte dei framework più diffusi che utilizzano tali sistemi proteggono noi dall'iniezione di XSS (Django, Modelli, Vue, React ecc.).
- Non utilizzare funzioni come
valutazioneoFunzionecon dati utente non attendibili. - Non utilizzare funzioni e proprietà che assegnano codice HTML direttamente agli elementi dell'albero DOM, ad es,
innerHTML,outerHTML,insertAdjacentHTML,ocumento.scrivere. Si possono invece utilizzare funzioni che assegnano il testo direttamente a questi elementi, come ad esempiotestoContenutootesto interno. - Fate attenzione quando reindirizzate l'utente a un URL che è sotto il suo controllo. Rischio di iniezione
location = 'javascript('XSS')'. - Filtrare l'HTML utilizzando librerie come
DOMPurificare. - Attenzione al caricamento
.htmlo.svgfile. È possibile creare un dominio separato da cui verranno serviti i file caricati. - Utilizzare il
Politica di sicurezza dei contenutimeccanismo. - Date un'occhiata ai filtri anti-XSS integrati nei browser più diffusi.
Se avete trovato interessante questo articolo, seguite Lukasz su Github: https://github.com/twistezo
Per saperne di più:
Strategie di recupero dei dati in NextJS