Cross-site scripting
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 hacker di inserire codice al fine di modificare il contenuto della pagina web visitata. In questo modo è possibile sottrarre dati sensibili presenti nel browser degli utenti che visiteranno successivamente quella pagina.
Secondo symantec nel 2007 l'80% di tutte le violazioni sono dovute ad attacchi XSS[1].
Gli attacchi alle vulnerabilità XSS hanno effetti dirompenti per i siti con un elevato numero di utenti, dato che è sufficiente una sola compromissione per colpire chiunque visiti la stessa pagina.
Tipologie
Esistono due tipi di vulnerabilità XSS:
- stored, nelle quali un attaccante è in grado di modificare permanentemente il contenuto di una pagina web, ad esempio inserendo un commento opportunamente preparato ad un post in un blog.
- reflected, grazie alle quali è possibile produrre un URL che, utilizzato sul sito vulnerabile, ne altererà il contenuto delle pagine in modo non permanente ed esclusivamente per le richieste HTTP che utilizzano tali URL appositamente forgiati.
L'attacco
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.
Per verificare la vulnerabilità di un sito è sufficiente (ad esempio) provare ad inserire del codice javascript 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 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
Escape degli input
Il Metodo più sicuro per un programmatore, è quello di usare uno delle tre funzioni in php che permettono l'escape dei caratteri html inserite in una stringa. Queste tre importanti funzioni sono: htmlspecialchars(), htmlspecialentities(), strip_tags. Quelle elencate sono tutte sicure, differenziano soltanto l'output, vi faccio vedere:
htmlspecialchars()
echo htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
# L'output sarà: <a href='test'>Test</a> dato che converte i caratteri "particolari", in codice html.
htmlentities
echo htmlentities("I'm <b>bold</b>");
# L'Output sarà di conseguenza: I'm <b>bold</b>
strip_tags
$text="<a href="#">Verrò cancellato, lo so</a>anche io<p>ed anche io</p>";
echo strip_tags($text);
#Il particolare output di questa funzione, sarà: <a><p>
#Come potete intuire, strip_tags elimina TUTTO il contenuto, anche quello fuori dai tags html lasciando soltanto i tag d'apertura.
PS=Questa non vuole essere una guida ai tre comandi, ma soltanto uno sguardo, quindi, se dovete attuare controlli sulle stringhe, vi consiglio personalmente di cercare informazioni su quelle tre funzioni
Aggiornare il browser
Per gli utenti, una possibile difesa è mantenere aggiornati i browser, le ultime versioni includono un filtro per questo tipo di attacchi, come Internet Explorer[2] e Mozilla Firefox[3].