Cosa è un XSS e come prevenirlo?

Cosa è un XSS e come prevenirlo?

Secondo alcune statistiche elaborate da OWASP, le vulnerabilità di tipo XSS (“Cross-Site Scripting”) sarebbero presenti in circa il 50% di tutti i software attualmente creati e affliggono in particolare le funzionalità di ricerca, inserimento di dati all’interno di campi specifici e reindirizzamenti a pagine esterne, facilmente manipolabili da attaccanti in grado di sfruttare al meglio queste funzionalità.

Nel corso di questo articolo andremo dunque a descrivere cosa sia una vulnerabilità di tipo XSS, quale è il suo impatto e come prevenire l’insorgere di problematiche relative a questa classe di attacco particolarmente diffusa.

Indice degli argomenti

  1. Quali sono le differenti tipologie di XSS?
  2. Che impatto può generare un XSS?
  3. Come prevenire le vulnerabilità XSS?

L’XSS è una classe di vulnerabilità di tipo client-side identificata da OWASP Top 10 con l’acronimo “A7” che, sfruttando lo scarso controllo dell’input fornito dall’utente, permette l’iniezione di codice HTML e JavaScript all’interno di una pagina web.

Con il termine “client-side” si identifica una problematica relativa al dispositivo adottato (client) dalla vittima e perciò non implica necessariamente una modifica del contenuto presente nel server, ma piuttosto di quanto è servito da quest’ultimo al client.

Quali sono le differenti tipologie di XSS?

Secondo la classificazione operata da OWASP nel 2017, le vulnerabilità di tipo XSS sono divise in 3 categorie in base alla causa da cui scaturisce la problematica e al tipo di iniezione che potrebbe essere permanente e potenzialmente estesa a tutti gli utenti oppure riflessa per la sola vittima che accede alla risorsa:

  • Type 1 o Stored XSS: L’input dell’attaccante viene immagazzinato nel server (database o in un form di commento) oppure salvato permanentemente nel browser della vittima e successivamente restituito dal sito senza alcuna validazione, comportando quindi iniezione di codice HTML e JavaScript in grado di attaccare qualsiasi utente che richieda la risorsa infetta;
  • Type 2 o Reflected XSS: L’input malevolo è passato dall’attaccante tramite un parametro che viene restituito direttamente, riflettendo nel codice HTML della pagina il valore inserito nel parametro in fase di rendering senza alcun tipo di codifica;
  • Type 0 o DOM XSS: Scoperta nel 2005 da Amit Klein, consiste in una vulnerabilità simile alle precedenti con la differenza che essa è presente direttamente nel codice JavaScript dell’applicazione.

Che impatto può generare un XSS?

L’iniezione di codice HTML/JavaScript è particolarmente diffusa soprattutto in applicativi web e in tal caso gli impatti possono essere differenti:

  • Defacement parziale o totale del sito web;
  • Inserimento di form che sembrino autentici per ottenere informazioni dall’utente (una specie di phishing potenziato in quanto attuato direttamente sul sito vulnerabile);
  • Leak di cookie e conseguente accesso all’account della vittima capitata sulla pagina malevola;
  • Eliminazione di qualsiasi difesa contro CSRF;
  • Reindirizzamento dal sito vulnerabile verso uno malevolo.

In caso l’iniezione di codice avvenga invece in un software desktop, questo potrebbe comportare addirittura il controllo della macchina della vittima.

Come prevenire le vulnerabilità XSS?

Secondo la guida “OWASP Cross Site Scripting Prevention Cheat Sheet”, le problematiche di tipo XSS possono essere eliminate controllando estensivamente tutti gli input passati dall’utente tramite l’ausilio di librerie apposite.

Tra le guidelines principali troviamo:

  • Non inserire alcun input non controllato all’interno dell’HTML di risposta;
  • Se è necessario riflettere dell’input nell’HTML, è consigliabile encodarlo tramite HTML Entity per evitare che possano essere iniettati tag HTML nella pagina;
  • Non inserire il valore passato dall’utente in uno script se non dopo encoding e sanitizzazione;
  • In caso vengano implementate API JSON fare attenzione che il contenuto sia restituito con un “Content-Type” come “application/json” e non “text/html”;
  • Adottare sempre URL encoding quando si riflette l’url della pagina nell’HTML della stessa;
  • In caso si accettino link (ad esempio in un form di commento), verificare che il link sia HTTP o HTTPS e non adotti uno URI scheme come “javascript:” o “data:”.

Per diminuire l’impatto degli XSS è invece necessario:

  • Usare il flag HttpOnly per i cookie in modo da evitare che un attaccante possa appropriarsi dei cookie di autenticazione della vittima;
  • Elaborare un sistema di difesa comprensivo di WAF per bloccare i payload e adottare policy CSP per evitare l’esecuzione del codice iniettato.

Conclusioni

Le vulnerabilità XSS sono sempre più diffuse e, malgrado i maggiori browser stiano cercando di introdurre all’interno dei propri software alcune mitigazioni per abbassare l’impatto di tali attacchi, gli hacker continuano a trovare nuove strade per sfruttare queste falle difficilmente contrastabili per via della variabilità dei vettori d’attacco. Controllare gli input e adottare librerie appropriate per validare l’input e bonificare l’output sono i migliori consigli per evitare che il vostro software risenta di questa problematica.