Cos'è il Cross-Site Scripting (XSS)?

Il Cross-Site Scripting (XSS) è un tipo di vulnerabilità molto comune che permette a un aggressore di inserire del codice malevolo (JavaScript) nei vostri browser sfruttando un'applicazione web vulnerabile. Gli aggressori possono inserire tale codice in diversi modi. Potrebbero convincervi a cliccare un link (Reflected XSS) o attendere che visitiate una pagina che contiene già il codice malevolo al suo interno (Stored o Persistent XSS).

Quel seccante pop-up col numero 1 al suo interno? Quello è solo un modo tramite il quale le persone dimostrano che il proprio codice JavaScript (XSS) è stato eseguito. Ma non lasciate che quel banale pop-up vi inganni, l'XSS è molto di più!

Cosa possono fare gli hacker con un XSS?

Un aggressore potrebbe essere in grado di sottrarvi i cookie e autenticarsi alle applicazioni web come se foste voi!

Potrebbero redirigervi verso un sito web malevolo senza che ve ne accorgiate, tentando di convicervi a fornire informazioni critiche, per esempio i vostri dettagli bancari.

Potrebbero creare pagine di login fasulle all'interno dell'applicazione vulnerabile, tentando di convincervi a inserire il vostro username e la vostra password.

Potrebbero anche usare gli XSS per bypassare altri meccanismi di sicurezza che sono implementati per proteggervi all'interno dell'applicazione e nel browser web.

Le possibilità sono quasi senza fine. Prendere il controllo della vostra webcam? Sì! Ascoltare dal microfono del vostro computer? Certo!

Per scoprire attacchi più avanzati potete visitare The Browser Exploitation Framework (BeEF)

Chi è stato attaccato tramite XSS?

La Apache Foundation, i creatori e manutentori di uno dei software per web server più popolari di Internet, hanno visto i loro server compromessi tramite un iniziale attacco via XSS.

Un attacco XSS sul forum officiale di Ubuntu, il popolare sistema operativo Linux, ha permesso agli aggressori di scaricare gli username, gli indirizzi e-mail e le password per 1.82 milioni di loro utenti.

Gli attacchi XSS, in genere, colpiscono gli utenti e le loro reti locali. Tuttavia, come negli esempi precedenti, quando tali utenti sono amministratori, anche i web server dell'applicazione sono a rischio.

Vulnerabilità XSS vengono scoperte quotidianamente su Facebook, Yahoo, Google, Twitter e altri siti famosi da parte di ricercatori indipendenti che partecipano ai bug bounty.

Qui potete trovare una lista di altri attacchi eseguiti tramite XSS - https://www.google.com/fusiontables/DataSource?snapid=S1158702BBoV

Come posso proteggermi dagli XSS?

Assicuratevi che il vostro browser web sia aggiornato e che le sue impostazioni di sicurezza siano attive, per esempio il filtro per Cross-Site Scripting (XSS). Se il vostro specifico browser non dovesse includere un filtro XSS, potete comunque installare un add-on come NoScript.

State attenti a quali link cliccate. Un link può sembrare innocuo, ma potrebbe contenere del codice per eseguire XSS.

Effettuate il logout dai siti web una volta che avete terminato di usarli, questo rende difficile agli hacker sottrarvi i vostri cookie.

La parte tecnica! Come posso proteggere la mia applicazione web dagli XSS?

Il Cross-Site Scripting avviene quando dei dati provenienti da fonti non fidate sono inclusi in una pagina web senza essere prima sanitizzati e/o codificati adeguatamente.

Per esempio, se un utente fornisce il proprio username per effettuare il login e poi la vostra applicazione mostra quello stesso username senza sanitizzarlo e/o codificarlo, cosa potrebbe succedere se lo username contenesse caratteri HTML? Il browser web non sarebbe in grado di distinguere tra lo username dell'utente e il codice HTML valido della pagina. Dei dati (lo username) sono mischiati con del codice (l'HTML della pagina)! Questo potrebbe permettere a un utente di autenticarsi con uno username contenente codice JavaScript malevolo e farlo eseguire nel browser all'interno del contesto della vostra applicazione web.

Assicuratevi di sanitizzare lo username prima di utilizzarlo. Per esempio, se gli utenti potessero avere solo caratteri alfanumerici nei loro username, allora forzate questo limite con la sanitizzazione dell'input. Utilizzate una whitelist! Confrontate gli username contro una lista di termini fidati invece che con una di termini da evitare.

Utilizzate la corretta codifica! Se uno username verrà utilizzato all'interno di HTML, allora codificate in HTML tutti i caratteri del nome utente. In questo modo il browser potrà distinguere cosa sia da mostrare in HTML e cosa no. Non si tratta solo di codifica HTML però! Dovete codificare per il corretto contesto dell'output. Guardate i link seguenti per ulteriori informazioni.

Analizzate le vostre applicazioni per problemi relativi agli XSS. Esistono numerosi scanner automatici per le applicazioni web in grado di rilevare anche gli XSS. Potreste provare il progetto open source OWASP ZAP.

Utilizzate il flag HttpOnly per i vostri cookie di sessione. Questo attributo comunica al browser che tale cookie non deve essere letto da codice JavaScript, aiutando a proteggere i vostri utenti dal furto delle loro sessioni.

Un header HTTP chiamato Content Security Policy (CSP) può essere configurato dal web server per comunicare al browser cosa e dove il codice JavaScript sia abilitato a essere eseguito. In aggiunta, fa uso di una whitelist!

Infine, perché non installare un Web Application Firewall (WAF), come l'open source mod_security! Un WAF fornirà alla vostra applicazione quel livello aggiuntivo di difesa contro gli aggressori, ma non dovrebbe essere utilizzato come unica soluzione poiché spesso vengono scoperte tecniche per aggirarne i meccanismi.

Dove posso trovare altre informazioni?

I due tipi di XSS trattati in questa pagina (Reflected e Stored) non sono gli unici! Qui abbiamo solo toccato l'argomento. Volete saperne di più?

L'Open Web Application Security Project (OWASP) è un'ottima risorsa per tutti gli argomenti relativi alla sicurezza delle applicazioni web. Guardate il loro articolo sugli XSS o il loro cheat sheet sulla prevenzione degli XSS. Per informazioni su altri tipi di vulnerabilità delle applicazioni web date un'occhiata alla OWASP Top 10.

Grazie della lettura,
Ryan Dewhurst & Thomas MacKenzie

---

Gli obiettivi di questa pagina sono la semplicità, l'utilizzo di un italiano semplice, la forma breve e accurata.

Il design di questa pagina è ispirato a http://justinjackson.ca/words.html

---

Thanks to Giovanni Cattani for this translation. English version here.