Cross-Site Scripting (XSS)

Cross-site scripting-preferito come XSS-è una vulnerabilità dell’applicazione che ha il potenziale di devastare applicazioni e siti web. XSS è così dilagante e potenzialmente dannoso che continua ad essere incluso nella lista delle 10 principali vulnerabilità dell’Open Web Application Security Project (OWASP).

In effetti il Cross-Site Scripting è la vulnerabilità più comune scoperta dal 2014 e nel 2019 continua ad apparire nella Top 3 delle vulnerabilità segnalate.

Top disclosed vulnerabilities – State of Open source Report 2020 by Snyk.

Che cos’è il Cross-Site Scripting (XSS)?

Il Cross-site scripting è un metodo di attacco ai siti web che utilizza un tipo di iniezione per impiantare script malevoli in siti web che altrimenti sarebbero produttivi e affidabili. Generalmente, il processo consiste nell’inviare uno script dannoso lato browser a un altro utente. Questa è una falla di sicurezza comune nelle applicazioni web e può verificarsi in qualsiasi punto di un’applicazione in cui l’input viene ricevuto dal browser e utilizzato per creare output senza prima convalidare o codificare i dati.

In alcuni casi, anche gli script lato browser possono introdurre questa vulnerabilità permettendo ad un attaccante di sfruttarla senza che l’utente target faccia una richiesta all’applicazione web.

Gli attaccanti sfruttano l’XSS creando codice maligno che può essere indirizzato ad un altro utente, viene poi eseguito dal browser ignaro. Poiché lo script è il più delle volte incluso nel contenuto della risposta dell’applicazione web, viene eseguito e ha lo stesso accesso come se lo script fosse legittimo. L’accesso può essere consentito ai token di sessione, ai cookie e anche alle informazioni riservate o sensibili a cui il browser ha accesso su quel sito, anche riscrivendo il contenuto della pagina HTML.

Salvaguardia contro gli attacchi XSS

Automaticamente trovare, dare priorità e correggere le vulnerabilità nelle dipendenze open source utilizzate per costruire le vostre applicazioni cloud native

Come funziona il Cross-site Scripting?

Sfruttare le vulnerabilità cross-site scripting è un compito relativamente semplice per gli attaccanti. Iniettando uno script maligno in un input non protetto o non validato dal browser, l’attaccante fa sì che lo script venga restituito dall’applicazione ed eseguito nel browser. Questo potrebbe permettergli di prendere il controllo delle funzionalità dell’applicazione, manipolare i dati o impiantare ulteriore codice dannoso.

Quali sono i tipi di attacchi XSS?

Ci sono tre tipi principali di attacchi XSS: XSS riflesso, XSS memorizzato, XSS basato su DOM.

Attacchi XSS riflessi

Negli attacchi XSS riflessi, lo script dannoso viene iniettato in una richiesta HTTP (di solito tramite un link appositamente creato fornito all’utente). Come varietà più semplice, utilizza parametri di input nella richiesta HTTP che possono essere facilmente manipolati per includere il contenuto dello script dannoso. Lo script dannoso viene poi riflesso dal server in una risposta HTTP e viene eseguito nel browser della vittima.

In questo caso, agisce come un XSS memorizzato senza effettivamente memorizzare dati dannosi sul server.

Ecco un esempio di attacco XSS riflesso:

Diciamo che example.com/profile contiene un parametro name. L’URL per la richiesta sarebbe come questo: https://example.com/profile?user=Tammy. Sulla base di questo input, l’applicazione web risponderebbe così con “Hi Tammy” all’inizio della pagina. Se i parametri non vengono convalidati per garantire che contengano solo i dati attesi, un attaccante potrebbe far visitare all’utente una versione dannosa dell’URL come questa: https://example.com/profile?user<script>some_malicious_code</script>.

Quando la risposta viene inviata al browser, include lo script dannoso, che viene poi eseguito nel browser, probabilmente senza che l’utente lo sappia. Questo è un esempio di attacco XSS riflesso, in quanto il codice dannoso viene immediatamente “riflesso” all’utente che effettua la richiesta.

Attacchi XSS memorizzati

In quello che è conosciuto come un attacco XSS memorizzato o persistente, il contenuto dannoso viene consegnato direttamente, insieme alla risposta del server quando l’utente carica una pagina web. Così il contenuto è già memorizzato nel database del sito web (da qui il nome di tali attacchi). Gli utenti entrano semplicemente nella pagina web violata e cadono vittime di tali attacchi.

Ogni singolo utente che apre un sito web compromesso è quindi a rischio di furto dei propri dati personali, e quindi questo potrebbe essere considerato il tipo più pericoloso di attacco XSS.

Ma come fa il contenuto dannoso ad entrare nel database per cominciare? Nella maggior parte dei casi, viene introdotto attraverso moduli di pagine web non protette in cui l’input dell’utente non è adeguatamente convalidato e sanificato. Se i dati inseriti da un hacker non vengono convalidati sia dal lato client che dal lato server, verranno salvati nel database. Per esempio, tale input potrebbe includere un’area di testo per i commenti, un editor di testo per i post, un editor di dati personali o altri moduli.

Figura 1: Flusso dell’attacco XSS memorizzato o persistente

Una volta che un attaccante riesce a inviare contenuti dannosi al server e tali contenuti appaiono non filtrati su una pagina web, tutti gli utenti diventano potenziali vittime.Il rimedio comune agli attacchi XSS memorizzati è di sanitizzare l’input sia sul front end che sul back end dell’applicazione. La sanitizzazione implica una combinazione di validazione dei dati e l’escaping dei caratteri speciali o il loro completo filtraggio ed è una best practice comune per la sicurezza web e JavaScript.

Attacchi XSS basati sul DOM

Document Object Model (DOM) è un’interfaccia che permette alle applicazioni di leggere e manipolare la struttura di una pagina web, il suo contenuto e lo stile. In un attacco XSS basato su DOM, la vulnerabilità risiede nel codice script lato browser e può essere sfruttata senza alcuna interazione con il server, modificando l’ambiente nel browser della vittima ignara.

A volte, gli attacchi XSS basati su DOM sono simili agli attacchi riflessi. L’esempio precedente di un attacco XSS riflesso può essere applicato in questo caso con un solo presupposto: L’applicazione web legge i dati direttamente da una stringa di query.

Supponiamo che l’applicazione utilizzi il parametro di query “name” per visualizzare istantaneamente il nome dell’utente sullo schermo mentre si aspetta il caricamento del resto della pagina. Senza un’adeguata convalida, questo può produrre lo stesso risultato di un attacco riflesso, se l’hacker riesce a far aprire alla vittima un link sospetto.

Come per lo stored XSS, per prevenire gli attacchi riflessi e basati sul DOM, gli sviluppatori dovrebbero implementare la convalida dei dati ed evitare di visualizzare l’input grezzo dell’utente, nonostante la presenza o l’assenza di comunicazione con il server.

Quali sono i vettori di attacco Cross-site Scripting?

Ci sono diversi vettori comunemente utilizzati negli attacchi XSS:

  • < tag script>: Un tag script può essere usato per fare riferimento a codice JavaScript esterno, rendendo questo il punto XSS più diretto. Gli attaccanti possono anche incorporare il codice dannoso all’interno del tag script.
  • Eventi JavaScript: Un altro popolare vettore XSS usato dagli attaccanti, gli attributi degli eventi, possono essere applicati in una varietà di tag. Tali attributi come “onerror” e “onload” sono esempi.
  • <body> tag: Gli attributi degli eventi possono anche essere la fonte dello script quando vengono forniti attraverso il tag “body”.
  • <img> tag: A seconda del browser in uso, questo attributo può essere utile agli attaccanti per eseguire il codice JavaScript.
  • <iframe> tag: Particolarmente efficace per gli attacchi di phishing, questo vettore permette all’attacco XSS di incorporare un’altra pagina HTML nella pagina corrente.
  • < taginput>: Alcuni browser permettono la manipolazione attraverso questo vettore, che può essere usato per incorporare uno script.
  • <link> tag: Questo tag può contenere uno script, invece del normale uso di collegamento a fogli di stile esterni.
  • <table> tag: Dove l’attributo di sfondo normalmente si riferisce a un’immagine, questo potrebbe essere compromesso per riferirsi allo script incriminato.
  • <div> tag: Anche questo tag contiene un riferimento allo sfondo e può essere usato allo stesso modo di <table> per riferirsi a uno script.
  • <object> tag: Gli script di un sito esterno possono essere inclusi usando questo tag.

Mentre ci sono altri vettori che gli attaccanti XSS usano nei loro sforzi per rubare informazioni e compromettere i siti web, questi sono alcuni dei metodi più comunemente usati. Gli sviluppatori devono aderire a pratiche corrette di escape e sanitizzazione per difendersi da tali attacchi.

Qual è l’impatto delle vulnerabilità XSS?

XSS ha il potenziale per portare il caos su applicazioni e siti web. Il fatto che XSS sia stato presente in ogni lista OWASP top 10 illustra la necessità di proteggere le applicazioni web da questa vulnerabilità.

A seconda dell’attaccante e del suo intento malevolo, gli attacchi XSS possono provocare diversi impatti, tra cui:

  • dirottare la sessione di un utente, utilizzando le credenziali per accedere ad altri siti o reindirizzare l’utente a siti web non desiderati,
  • alterare le pagine del sito o inserire sezioni in una pagina web,
  • eseguire script per estrarre informazioni sensibili da cookie o database,
  • se la vittima ha diritti amministrativi, l’attacco potrebbe estendersi al lato server, causando ulteriori danni o recuperando ulteriori informazioni sensibili.

Come testare il Cross-site Scripting?

Il test per la vulnerabilità XSS inizia nella fase di progettazione, tenendo conto delle migliori pratiche fin dall’inizio. I progettisti di siti web dovrebbero costruire misure di sicurezza, non aggiungerle dopo il fatto.
I test iniziali includono scansioni del codice per identificare l’uso dei comuni vettori di attacco XSS che presentano potenziali vulnerabilità. Questo permette di mitigare le debolezze prima che inizi il test effettivo dell’applicazione.

Passi chiave nei test per le vulnerabilità XSS per le applicazioni web critiche includono:

  • utilizzare uno strumento di scansione del codice per rilevare le vulnerabilità che consentono correzioni del codice durante il processo di sviluppo,
  • implementare funzionalità di test automatizzate che riveleranno le potenziali vulnerabilità in modo completo e veloce.

Testa il tuo codice per le vulnerabilità XSS

Trova automaticamente, dai priorità e correggi le vulnerabilità nelle dipendenze open source utilizzate per costruire le tue applicazioni cloud native

Cos’è un esempio di Cross-site Scripting?

Il Cross-site scripting può essere sfruttato quando un’applicazione web utilizza i dati forniti dal browser per creare risposte alle richieste degli utenti. Un esempio molto semplicistico sarebbe un caso in cui un’applicazione web fa uso di un parametro nell’URL per fornire una risposta personalizzata all’utente.

Diciamo che exmple.com/profile contiene un parametro nome. L’URL per la richiesta sarebbe come https://example.com/profile?user=Tammy. L’applicazione web risponde con “Hi Tammy” all’inizio della pagina sulla base di questo input.

Se il parametro utente non viene convalidato per garantire che contenga solo i dati attesi, un aggressore potrebbe far visitare all’utente una versione dannosa dell’URL che assomiglia a questa:
https://example.com/profile?user<script>some_malicious_code</script>.
Quando la risposta viene inviata al browser, include lo script dannoso che viene poi eseguito nel browser, probabilmente senza che l’utente lo sappia. Questo è un esempio di attacco XSS riflesso. Il codice dannoso viene immediatamente “riflesso” all’utente che ha fatto la richiesta.

Come prevenire il Cross-site Scripting?

Ci sono diverse azioni chiave per prevenire gli attacchi XSS: migliorare l’educazione e la consapevolezza dei vostri sviluppatori, controllare e convalidare i dati in ingresso e scansionare il codice per le vulnerabilità.

  • Educazione e consapevolezza: Assicuratevi che tutti gli sviluppatori, i progettisti di siti web e i team di QA siano consapevoli dei metodi che gli hacker utilizzano per sfruttare le vulnerabilità e fornire linee guida e best practice per la codifica. Questo include tecniche di escape/codifica adeguate per l’ambiente dell’applicazione (JavaScript, HTML, ecc.).
  • Sanitizzare l’input: Che si tratti di pagine web interne o di siti pubblici, non fidatevi mai della validità dei dati inseriti dall’utente. Vagliare e convalidare qualsiasi campo di dati, specialmente se sarà incluso nell’output HTML.
  • Scansionare il codice: Implementare un software che analizza il codice per le vulnerabilità, compreso il cross-site scripting, per garantire che le migliori pratiche siano seguite e minimizzare l’esposizione da XSS e altre vulnerabilità elencate da OWASP.
  • Content Security Policy: Utilizzare la Content Security Policy (CSP) per definire ciò che un sito web può fare, e con questo ridurre il rischio di un attacco XSS. Usando la CSP, gli XSS possono essere bloccati completamente (bloccando tutti gli script in linea) o essere ridotti a un rischio molto più basso.

OWASP fornisce ulteriori indicazioni su come prevenire le vulnerabilità XSS con un foglio di istruzioni completo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.