Cross-site scripting

Da Wikipedia, l'enciclopedia libera.

Il Cross-site scripting (XSS) è una vulnerabilità che affligge siti web dinamici che impiegano un insufficiente controllo dell'input nei form. Un XSS permette ad un Cracker di inserire o eseguire codice lato client al fine di attuare un insieme variegato di attacchi quali ad esempio: raccolta, manipolazione e reindirizzamento di informazioni riservate, visualizzazione e modifica di dati presenti sui server, alterazione del comportamento dinamico delle pagine web ecc... Nell'accezione odierna, la tecnica ricomprende l'utilizzo di qualsiasi linguaggio di scripting lato client tra i quali JavaScript, VBScript, Flash, HTML.

Secondo un rapporto di Symantec nel 2007 l'80% di tutte le violazioni è dovuto ad attacchi XSS[1].

Origine e trasformazione del concetto[modifica | modifica sorgente]

L'espressione "cross-site scripting" originariamente si riferiva unicamente ad attacchi basati sull'utilizzo di frammenti di codice JavaScript inseriti all'interno di chiamate a pagine web dinamiche poste su un web-server (tecnica facente parte dei metodi di code injection) in modo che il server remoto eseguisse operazioni diverse da quelle previste originariamente dall'applicativo web. Tale definizione, gradualmente, si è estesa comprendendo anche altre modalità di "iniezione di codice" basate non solo su JavaScript ma anche su ActiveX, VBScript, Flash, o anche puro HTML. Ciò ha generato una certa confusione nella terminologia riferita alla sicurezza informatica: il termine, infatti, ricomprende oggi tutto un insieme di tecniche di attacco e non esclusivamente quella basata su manipolazione di codice JavaScript.[2][3]

Tipologie[modifica | modifica sorgente]

Esistono due tipi di vulnerabilità XSS:

  • stored, quando il codice di scripting viene inserito in maniera permanente sul server (es. quando viene sfruttata in un forum);
  • reflected, quando il payload viene iniettato tramite richieste GET o POST del protocollo HTTP) effettuate dallo stesso client che subisce l'attacco (es. si induce l'utente ad aprire un URL forgiato appositamente, contenente codice scripting che verrà iniettato nella pagina ed eseguito client side.).

Un esempio di attacco[modifica | modifica sorgente]

Questa vulnerabilità è dovuta a errori dei programmatori, che molto spesso trascurano completamente la validazione delle informazioni passate in input con le richieste HTTP, sia GET che POST (ad esempio, l'input di una stringa in un form di ricerca).

Per verificare la vulnerabilità di un sito è sufficiente (ad esempio) provare ad inserire del codice JavaScript o SQL nel suo campo di ricerca allo scopo di produrre effetti sulla pagina risultante, causando l'esecuzione del codice inserito.

Il seguente è un semplice frammento di codice JavaScript adatto al test:

<script type="text/javascript">alert('XSS')</script>


Tra le operazioni che è possibile indurre il browser ad eseguire vi sono l'invio del contenuto di cookie a terze parti e l'aggiunta di elementi (X)HTML alla pagina, operazione che può servire facilmente a sottrarre credenziali di autenticazione per mezzo di un modulo di inserimento contraffatto sovrapposto ad un modulo originariamente presente nella pagina web.

Come difendersi[modifica | modifica sorgente]

Escape degli input in PHP[modifica | modifica sorgente]

Il metodo più sicuro per un programmatore PHP, è quello di usare una delle tre funzioni che permettono l'escape dei caratteri html inserite in una stringa. Dette funzioni sono: htmlspecialchars(), htmlentities(), strip_tags: tutte sicure, si differenziano soltanto per l'output:


htmlspecialchars()

echo htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
# L'output sarà: 
&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt; dato che converte i caratteri "particolari", in codice html.


htmlentities

echo htmlentities("I'm <b>bold</b>");
# L'Output sarà di conseguenza: 
I'm &lt;b&gt;bold&lt;/b&gt;


strip_tags

$text='<p>Testo interno al paragrafo.</p><!-- commento --> <a href="#ancora">Altro testo</a>';
 
echo strip_tags($text);
 
# Il particolare output di questa funzione, sarà: 
Testo interno al paragrafo. Altro testo
 
# E' possibile non rimuovere alcuni tag utilizzando il secondo parametro opzionale:
 
echo strip_tags($text,'<p>');
 
# Il particolare output di questa funzione, sarà: 
<p>Testo interno al paragrafo.</p> Altro testo


Aggiornare il browser[modifica | modifica sorgente]

Per gli utenti, una possibile difesa contro la tipologia "reflected" è mantenere aggiornati i browser, le ultime versioni includono un filtro per questo tipo di attacchi, come Internet Explorer[4] e Mozilla Firefox[5].

Note[modifica | modifica sorgente]

  1. Dominator and Dominator Pro tool Opensource per identificare domXSS http://dominator.mindedsecurity.com
  1. ^ (EN) Symantec Internet Security Threat Report: Trends for July-December 2007
  2. ^ Grossman, Jeremiah, The origins of Cross-Site Scripting (XSS), 30 luglio 2006. URL consultato il 15 settembre 2008.
  3. ^ Wikipedia, Cross-site scripting.
  4. ^ Filtro Internet explorer 9
  5. ^ Mozilla contro gli attacchi XSS: novità per Firefox

Voci correlate[modifica | modifica sorgente]

Sicurezza informatica Portale Sicurezza informatica: accedi alle voci di Wikipedia che trattano di Sicurezza informatica