ASPcenter.net

1 marzo 2010

Difendersi dall’XSS (cross-site scripting) con ASP

Archiviato in: ASP e Sicurezza — Tag:, — lukeonweb @ 14:54

Il Cross-site scripting (o XSS) è un tipo di attacco (cui sono vulnerabili diversi siti web dinamici) che ha lo scopo di diffondere pericoli di vario genere sfruttando la visbilità di un sito lecito (vittima dell’attacco).

Gli attacchi XSS sfruttano, infatti, le possibilità di input della pagina (querystring, post, cookie,…) per "inniettare" codice pericoloso (generalmente Javascript) all’interno di un dato sito al fine di colpirne l’utenza.


Gli utenti del sito attaccato vengono, infatti, colpiti di rimbalzo a causa delle vulnerabilità dei browser che consentono l’esecuzione di script lato client talvolta molto pericolosi.

Tengo a precisare che ho parlato di vulnerabilità, non di bug, ragion per cui è possibile gestire questo aspetto con un semplice script di controllo lato server in fase di progettazione di un’applicazione Web.

Vediamo in pratica di cosa si tratta.

XSS sfrutta le querystring della pagina; capita spesso di avere pagine con URL del tipo:

pagina.asp?parametro=XYZ

oppure:

pagina.asp?parametro=123

quindi variabili di tipo stringa, numerico, alfanumerico o anche con caratteri speciali.

XSS può fare uno scherzo del genere se i valori delle variabili di tipo querystring non vengono gestite:

pagina.asp?parametro=<script>alert('Ciao da XSS!')</script>

In sostanza, oltre ad un’eventuale serie di errori di esecuzione della pagina, il risultato sarà un alert col messaggio specificato al suo interno… definire questa cosa come “inacettabile” è come farle un complimento!

Attraverso Javascript o VBScript, quindi attraverso uno script lato client, è possibile sfruttare bug del sistema e provocare danni al sistema stesso ed agli utenti della pagina che viene malevolmente sfruttata per generare un XSS ed in sede legale il responsabile del sito è responsabile anche dei danni provocati, anche se non è stato materialmente lui a provocarne… ammesso ovviamente che non riesca a dimostrare il contrario.

La soluzione è semplice, ovvero filtrare il codice HTML per renderlo non eseguibile ma stampabile a video. ASP dispone infatti del metodo HTMLEncode dell’oggetto Server, ragion per cui si può impostare un filtro base, in fase di recupero della querystring, come il seguente:

<%
    Dim parametro
    parametro = Server.HTMLEncode(Request.QueryString("parametro"))
%>

ma la soluzione non è elegante e nemmeno pratica, ma soprattutto non gestisce altri aspetti legati al funzionamento degli script della pagina, dato che non viene gestito il tipo di dato che potrebbe essere uno di quelli descritti in precedenza.

Creiamo quindi una funzione predefinita, da includere in un file di configurazione dell’applicazione Web in oggetto, che possiamo chiamare XSS_Filter().

Vediamo il codice:

<%
    Function XSS_Filter(MyQueryString)
        If IsNumeric(MyQueryString) Then
            MyQueryString = CInt(MyQueryString)
        Else
            MyQueryString = Server.HTMLEncode(MyQueryString)
        End If
        XSS_Filter = MyQueryString
    End Function
%>

Il funzionamento è semplice: verifichiamo che la querystring sia numerica e la convertiamo in numerica intera; in caso contrario effettuiamo la trasformazione del codice HTML.

Il funzionamento di questa funzione non si sposta di una virgola da quello dell’esempio grezzo impostato in precedenza, ma la filosofia è più corretta.

A questo punto recuperiamo la querystring:

<%
    Dim parametro
    parametro = XSS_Filter(Request.QueryString("parametro"))
%>

e proviamo a stamparla a video:

<%
    Response.Write parametro
%>

oppure ad utilizzarla in qualsiasi altro modo necessiti alla nostra applicazione Web… senza pericoli!

Nessun commento »

Non c'è ancora nessun commento.

RSS feed dei commenti a questo articolo. TrackBack URL

Lascia un commento

ASPcenter.net è il blog italiano su ASP, ASP.Net, VB.Net, C# e Visual Studio - Funziona con WordPress