Attacchi XSS

XSS

Un attacco Cross-Site Scripting, spesso abbreviato come XSS, è una tipologia d’iniezione di codice in un sito web affidabile. Ne esistono diverse tipologie che differiscono tra di loro in base alle potenzialità e alla possibilità di distribuzione. Generalmente, si verifica quando un criminale inietta uno script malevolo (lato browser) e lo invia ad un altro utente.

I difetti che consentono l’esecuzione di questi attacchi sono molto diffusi e occorrono ogni qualvolta una web application usi l’input dell’utente nell’output generato senza validarlo o sanificarlo.

Una volta ricevuto lo script malevolo, il browser della vittima esegue lo script poiché non ha alcun modo per sapere che questo sia malevolo. Dato che questo ritiene che sia sostanzialmente benevolo, lo script può accedere a ogni cookie, session tokens o informazione – anche sensibile – contenuta nel browser e usata dal sito web compromesso. Di conseguenza, lo script malevolo potrà leggere ogni contenuto della pagina HTML e accedere alle modalità di gestione della sessione utente.

Esistono tre tipologie d’attacco XSS:

  1. Reflected XSS (Type I): questa tipologia di attacco XSS si verifica quando l’input utente viene immediatamente utilizzato dalla web application in un messaggio d’errore, output di ricerca, o ogni altra risposta che inclusa l’input dell’utente come parte della richiesta e senza archiviare persistentemente l’input utente. In alcuni casi (come nella terza tipologia – DOM Based XSS), l’input utente può non lasciare mai il browser dell’utente.
  2. Stored XSS (Type 2 o persistente): un attacco stored XSS si verifica quando l’input utente viene salvato e renderizzato (insicuramente, quindi) dal browser della vittima. Tendenzialmente, il salvataggio viene effettuato dal server (come in un database, log, etc.). Tuttavia, con l’arrivo di HTML5 e altre tipologie browser, un attacco di questo genere può verificarsi senza essere mai inviato al server bensì essendo salvato permanentemente nel browser della vittima come, ad esempio, in un database HTML5.
  3. DOM Based XSS (Type 0): un attacco DOM (Document Object Model) Based XSS si verifica tendenzialmente quando Javascript accetta input da una fonte manipolabile dall’utente (come lo URL) e lo passa ad un elemento che accetta esecuzione di codice dinamico come la funzione eval() o la proprietà innerHTML. L’origine più comune per un attacco XSS è lo URL a cui, generalmente, si accede mediante l’oggetto window.location. Un criminale può quindi creare un collegamento da inviare alla vittima a una pagina vulnerabile con un payload nella stringa di query e frammenti di parti dell’URL.

Dato che queste tipologie molto spesso si sovrappongono negli scenari reali, la comunità tecnica ha iniziato ad utilizzare, dal 2012ca, una distinzione basata esclusivamente sull’origine della minaccia arrivando, quindi ad una distinzione basilare tra Server XSS e Client XSS.

DOM Based XSS tramite JQuery: è necessario identificare elementi che possono manipolare il DOM (es. la funzione JQuery attr() ). Se i dati sono ottenuti tramite una fonte manipolabile dall’utente come l’URL e, di seguito, passati a questa funzione, è possibile manipolare il valore inviato e causare l’XSS. Supponendo che il codice Javascript sia il seguente:

$(function() {

$('#backLink').attr("href",(new 
URLSearchParams(window.location.search)).get('returnUrl'));

});

Sarà possibile effettuare l’attacco XSS modificando lo URL in modo che la location.search contenga il codice malevolo. Dopo aver premuto su link “backLink”, questo eseguirà il codice malevolo come, ad esempio, quanto di seguito riportato:  

?returnUrl=javascript:alert(document.domain)

Innanzitutto, è necessario ricordare che nessun dato non “fidato” dovrebbe mai essere scritto dinamicamente nel corpo HTML. Nel caso in cui non siamo assolutamente possibile evitare di renderizzare dati non “fidati”, sarà necessario ricorrere a funzioni di sanificazione e/o codifica dei dati. Questo può essere un compito particolarmente complesso e, a seconda del contesto d’inserimento dati, può comportare combinazioni di JavaScript escaping, HTML encoding e URL encoding (nell’ordine appropriato).

Javascript Encoding: un classico meccanismo utilizzato durante gli attacchi XSS è quello di inserire un “escaper” ovverosia un “ o un ‘ per chiudere manualmente il tag HTML. Un meccanismo molto utilizzato per evitare tale semplice tecnica d’attacco è quella di utilizzare un encoding JavaScript. Per esempio, una funzione per effettuare l’escaping di caratteri quali ‘ e “ potrebbe assomigliare a questa:


function addslashes( str ) {
    return (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');
}

Questa funzione assomiglia alla funzione nativa di PHP addslashes() e serve a far precedere al singolo apice e alle virgolette il carattere d’escaping “\”.