Cross-site Scripting (XSS) è una vulnerabilità della sicurezza che si trova solitamente in siti web e/o applicazioni web che accettano l'input dell'utente. Esempi di questi includono motori di ricerca, moduli di accesso, bacheche e caselle di commento.
I cyber criminali sfruttano questa vulnerabilità inserendo stringhe di codice dannoso eseguibile in queste funzioni. In questo modo il codice dannoso viene inserito nel contenuto del sito Web di destinazione, rendendolo parte del sito Web e consentendogli così di colpire le vittime che possono visitare o visualizzare tale sito Web. Il codice può anche presentarsi come contenuto transitorio che non fa effettivamente parte del sito web, ma sembra essere solo per il visitatore. Ciò fa sembrare che il sito web sia effettivamente compromesso dai cyber criminali.
I cyber criminali possono anche utilizzare questa vulnerabilità per assumere il controllo o compromettere direttamente un sito web, nonché sfruttare altre vulnerabilità esistenti sul server o sul software del sito web.
Con XSS, i cyber criminali possono trasformare siti web affidabili in siti dannosi, causando così danni inordinati e danni non solo alle vittime, ma anche alla reputazione del proprietario del sito web affidabile.
I siti web compromessi da XSS possono causare un numero qualsiasi di minacce per attaccare il sistema di un utente. Ciò può comportare qualsiasi cosa, dal contenuto inappropriato visualizzato al malware scaricato nel sistema senza che l'utente lo sappia.
Per quanto pericoloso sia XSS, esistono modi per correggere tale vulnerabilità. I proprietari dei siti web devono assicurarsi che tutte le loro applicazioni web che accettano l'input dell'utente lo facciano in modo da eliminare le stringhe immesse prima di creare la pagina risultante dell'input. Ciò impedisce l'esecuzione di qualsiasi iniezione di codice. Gli utenti, invece, devono disabilitare lo scripting sui loro browser ed evitare di fare clic sui link di parti o mittenti sospetti.
Secondo l'Open Web Application Security Project (OWASP), gli attacchi XSS rientrano in una delle tre categorie: XSS riflesso, XSS memorizzato e XSS modello oggetto documento (DOM). Questi sono descritti in dettaglio di seguito.
Un attacco XSS riflesso si verifica quando un hacker consegna uno script dannoso a un'applicazione web vulnerabile, che il server ritorna quindi nella risposta HTTP. Il browser della vittima esegue lo script dannoso come parte della risposta HTTP, compromettendo l'utente legittimo e inviando informazioni private all'hacker.
Gli attacchi XSS riflessi in genere prendono di mira i messaggi di errore o le pagine dei risultati del motore di ricerca, poiché è facile inviare un'email dannosa con un collegamento su cui molti utenti faranno clic. Quando l'utente fa clic sul collegamento, il server riceve la richiesta contenente lo script dannoso e, poiché non viene memorizzato, risponde inviando un codice all'utente. Quando gli input degli utenti non sono adeguatamente convalidati e disinfettati o quando i dati vengono duplicati in modo non sicuro da una richiesta, esiste il rischio di vulnerabilità XSS riflesse.
La prima linea di difesa contro gli attacchi XSS è filtrare i contenuti e verificare gli input degli utenti. È possibile utilizzare le liste di sicurezza e le liste di blocco dei fornitori di script per rifiutare i modelli di dati rischiosi.
Inoltre, è possibile implementare una rigorosa Content Security Policy (CSP) per identificare la fonte degli script in linea, riducendo il rischio di attacchi XSS riflessi. Un forte CSP offre il controllo degli script e delle posizioni delle pagine web in cui possono essere caricati ed eseguiti.
In un attacco XSS memorizzato, uno script dannoso salva l'input dell'utente nel server di destinazione. A differenza di un attacco XSS riflesso, che viene eseguito sul server, un attacco XSS memorizzato viene eseguito sul browser dell'utente. Gli aggressori utilizzano quindi moderne applicazioni HTML5, che in genere utilizzano database HTML, per memorizzare in modo permanente script dannosi nel browser.
In un attacco XSS memorizzato, lo script viene salvato ed eseguito sul server ogni volta che l'utente accede al sito Web interessato. È facile per un aggressore colpire un gran numero di vittime e il risultato è persistente. Gli attacchi XSS memorizzati possono verificarsi anche quando utenti non addestrati tentano di estrarre dati dal software senza prendere alcuna precauzione di sanificazione o convalida.
Gli attacchi XSS archiviati mirano a riflettere uno script dannoso per un utente, quindi il modo più semplice per prevenirlo è quello di sanificare i dati degli utenti e gestire gli input con attenzione, mentre il modo migliore per prevenirli è utilizzare un appropriato binding dei parametri.
È possibile sanificare i dati con un sistema di modelli con eliminazione automatica o codifica HTML. È necessario codificare i dati destinati all'output per impedire al server di interpretarli come contenuti attivi. Ciò significa che l'applicazione gestirà caratteri speciali nei suoi dati salvati come contenuto di tag HTML, piuttosto che HTML semplice.
Il legame dei parametri (dati) dei dati varia a seconda del vettore, ma è sempre possibile passare variabili come valori aggiuntivi al di fuori della normale funzionalità della funzione. È anche possibile utilizzare intestazioni di risposta appropriate per prevenire gli attacchi, in genere semplicemente aggiungendo alcune righe di codice.
Un'altra tecnica per impedire che gli attacchi XSS si verifichino in tempo reale è quella di utilizzare una sicurezza dinamica che cerchi attivamente i tentativi di sfruttamento. Bloccando i modelli noti, è possibile impedire agli aggressori di sfruttare le falle esistenti.
Infine, è possibile utilizzare Web Application Firewall (WAF) per il rilevamento e la mitigazione degli attacchi XSS in tempo reale.
L'interfaccia DOM consente l'elaborazione e la manipolazione dei contenuti delle pagine web leggendo e modificando i documenti HTML e XML. Gli attacchi XSS basati su DOM introducono modifiche dannose al contesto DOM del browser della vittima, causando l'esecuzione involontaria del codice lato client.
Gli attacchi XSS basati su DOM, a differenza degli attacchi XSS riflessi e archiviati, non memorizzano lo script dannoso né lo consegnano al server. In questo attacco, il browser della vittima è l'unica vulnerabilità. Poiché sono più difficili da comprendere rispetto ad altre categorie, le vulnerabilità basate su DOM sono rare, sofisticate e difficili da superare. Inoltre, gli scanner di vulnerabilità automatizzati e i firewall per le applicazioni web non sono in grado di identificarli facilmente.
È possibile utilizzare le stesse tecniche per prevenire questo attacco di quelle per gli altri due, ma è necessario prestare particolare attenzione per disinfettare il codice lato cliente. Due soluzioni efficaci sono quelle di impedire alle fonti controllate dall'utente di modificare funzioni JavaScript potenzialmente pericolose (note come sink) o di consentire solo contenuti affidabili utilizzando una lista di sicurezza. Con queste precauzioni, le stringhe che potrebbero mettere in pericolo il DOM non saranno inviate ai lavandini. È inoltre possibile sanificare i dati utilizzando la funzionalità del browser integrata, riducendo il rischio di problemi correlati alle modifiche del parser.
Una nuova difesa contro questo tipo di attacco è utilizzare tipi affidabili. Si tratta di un meccanismo di sicurezza del browser che garantisce che tutte le parti rischiose del DOM possano essere utilizzate solo da dati che hanno superato un criterio predefinito. Impedisce che le stringhe arbitrarie vengano trasmesse a destinatari potenzialmente pericolosi, il che aiuta il browser a distinguere tra codice e dati, rimuovendo la principale fonte di vulnerabilità.
Gli attacchi XSS sono classificati come server XSS o client XSS. I programmi lato client vengono eseguiti sul dispositivo o sul browser del client e si occupano dell'interfaccia utente e di qualsiasi altra elaborazione eseguita sul dispositivo del client. I programmi lato server operano sui server e creano il contenuto di una pagina Web.
XSS lato server si verifica quando tutto il codice lato server è vulnerabile e il browser rende la risposta ed esegue gli script legittimi incorporati. D'altra parte, XSS lato client viene eseguito sul dispositivo dell'utente e modifica una pagina web dopo il caricamento.
Un attacco XSS è possibile ovunque ci sia HTML. Che siano memorizzati, riflessi o basati su DOM, tutti gli attacchi XSS hanno lo stesso effetto: Un aggressore ottiene il controllo completo di una sessione web.
Anche questi attacchi XSS possono sovrapporsi e un sito web può essere vulnerabile a tutti e tre contemporaneamente. Nel caso di un singolo sito web o di un'applicazione offline, tutti e tre i tipi di attacco potrebbero presentarsi direttamente nel browser. Tuttavia, il loro comportamento può differire quando i dati vengono salvati sul server rispetto a quando vengono riflessi dal server.