asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 7993
ASPCode.it - Store

  > > Articoli

Come difendersi da attacchi di tipo Injection

Data di pubblicazione: 13/09/2006        Voto della community: 4,53 (Votanti: 30)

Gli injection attack sono degli attacchi ad applicazioni web che sfruttano dei bug del sistema causati dalla poca esperienza e dalla totale o parziale conoscenza di questo tipo di problematiche da parte del programmatore.
Il principio sul quale si basano è molto semplice: introdurre del codice all’interno delle pagine web che provochi un comportamento da parte del sistema diverso da quello per il quale è stato creato.
Ma come si fa ad introdurre del codice in uno script? Lo si fa in continuazione ma probabilmente non ce ne rendiamo neanche conto: pensiamo ad una TextBox nel quale inseriamo delle parole per una ricerca, o all’user ed alla password che inseriamo per l’autenticazione in un sito, o ancora nei campi che utilizziamo nei guestbook; proprio quel testo che l’utente scrive viene passato ad uno script che lo elabora e ne restituisce un output.
Ci sono due possibili attacchi di questo genere: SQL INJECTION e CROSS SITE SCRIPTING.

SQL Injection

Come si può facilmente intuire dal nome gli attacchi di questo tipo mirano a violare un DBMS sfruttando l’SQL (Structured Query Language ) ovvero quel linguaggio utilizzato per interagire con i DataBase.
I DataBase sono il cuore della maggior parte delle applicazioni web ed è quindi facile intuire che la sua violazione potrebbe produrre effetti molto gravi che vanno dalla appropriazione di informazioni personali sugli utenti (numero di carta di credito, informazioni anagrafiche) alla compromissione dell’integrità del DataBase, fino ad arrivare nelle peggiori delle ipotesi alla distruzione del DataBase stesso.
Vediamo nel concreto in cosa consiste e quale potrebbe essere un possibile attacco:
immaginiamo un classico scenario nel quale uno script cerchi nel database i record che contengono la stringa inserita dall’utente in una TextBox; ipotizziamo che l’utente voglia ricercare i record che contengono la parola “pippo” nel campo MioCampo e che lo script sia il seguente

<%

dim varRicerca ‘ Dichiaro la variabile
varRicerca = Request.Form("campoRicerca") ‘ Assegno alla variabile la stringa inserita dall’utente

strSQL = "SELECT * FROM MiaTabella where MioCampo =’” & varRicerca & “’” ‘ Istruzione SQL
set RS = conn.Execute(strSQL) ‘ Eseguo l’istruzione SQL

%>

In esecuzione la query SQL che verrà eseguita sarà: “SELECT * FROM MiaTabella where MioCampo=’pippo’” cioè il RecordSet conterrà tutti i record che hanno “pippo” come valore di MioCampo.
Ora proviamo ad immaginare che l’utente inserisca come valore di ricerca la seguente stringa:"‘;Drop MiaTabella;"
In esecuzione la query SQL che verrà eseguita sarà:
SELECT * FROM MiaTabella where MioCampo=’’;Drop MiaTabella;’” cioè avremo come risultato la selezione dei record che hanno come valore di MioCampo una stringa vuota e la cancellazione della tabella MiaTabella.
Utilizzando questo stesso metodo sarà possibile far risultare sempre vere determinate condizioni, come quella per l’autenticazione, che permettano a chi sferra l’attacco di riuscire ad entrare in aree riservate di un’applicazione vulnerabile.

Gli attacchi di questo genere non sono semplici da attuare e non è detto che vadano sempre a buon fine per due motivi:il primo è che chi sferra l’attacco dovrebbe sapere il nome della tabella,il che non è impossibile però è abbastanza per scoraggiare o difendersi dallo smanettone di turno; il secondo è che per effettuare modifiche alla struttura del DataBase l’utente con il quale si fa la connessione al DBMS dovrebbe avere gli opportuni permessi per effettuare determinate operazioni.

Cross-site scripting

Più conosciuto con il nome di script injection, a questo tipo di attacchi sono vulnerabili siti dinamici e non; lo scopo è quello di introdurre degli script (JavaScript, VBScript o simili) che modifichino o alterino il comportamento della pagina web.
Per essere più concreti facciamo un esempio:
immaginiamo un comunissimo guestbook nel quale gli utenti scrivono un messaggio con una opinione, un commento o qualsiasi altra cosa; questo viene salvato (in genere in un DataBase); ogni qualvolta viene caricata la pagina contenente i messaggi degli utenti uno script provvederà a selezionare i messaggi e a stamparli a video.
Ma cosa succede se nel messaggio scriviamo qualcosa del tipo:
<script> alert(‘Ciao Mondo!!!’) </script>
quando lo script andrà a caricare il messaggio all’interno della pagina web il browser lo interpreterà come un comunissimo script e quindi ci visualizzerà il classico messaggio con la scritta Ciao Mondo!!!
Sfruttando questo metodo sarà quindi possibile effettuare diverse operazioni che vanno al di fuori dallo scopo originale del sito attaccato, come ad esempio l’aggiunta in modo arbitrario di un sito tra i preferiti, la modifica della pagina iniziale di navigazione del nostro browser o il redirect ad una pagina appositamente creata per catturare i nostri coockie.

Come difendersi

Per difendersi da questi attacchi la soluzione più semplice è quella di controllare sempre tutte le stringhe provenienti dall’esterno ed assicurarsi che al loro interno non ci siano tag o caratteri speciali che potrebbero rendere la vostra applicazione vulnerabile.
Analizziamo questa semplicissima funzione:

<%
Function injectionControl(str)
  Dim tmpstr ‘ variabile temporanea che utilizzeremo per manipolare la stringa
  tmpstr = str ‘ assegno alla variabile temporanea il valore del parametro della funzione

  tmpstr = replace(tmpstr, ”’”, ”’’”) ‘ raddoppiamo tutte le apici presenti nella stringa
  tmpstr = replace(tmpstr, ”<script>”, ””) ‘ elimina il tag <script>
  tmpstr = replace(tmpstr, ”</script>”, ””) ‘ elimina il tag </script>

  injectionControl = tmpstr ‘ restituisco l’output della funzione
End function
%>

La funzione injectionControl è molto banale e si limita ad eliminare i tag <script> e </script> per prevenire attacchi come quelli nell’esempio precedente, mentre il raddoppio delle apici è un metodo abbastanza comune per prevenire gli attacchi di tipo SQL injection.
Un altro tipo di controllo potrebbe essere fatto sul tipo di dato in input, cioè se ad esempio ci sia aspetta un valore numerico dall’esterno possiamo sfruttare la funzione IsNumeric() per controllare che sia stato inserito effettivamente un numero e non del testo contenente, potenzialmente, codice per un attacco; questo tipo di controllo serve anche a prevenire errori del DBMS causati dall’incompatibilità del tipo di dati, ovvero se un campo della tabella nella quale stiamo cercando di scrivere è di tipo integer e noi cerchiamo di inserire una stringa verrà generato un errore che se non opportunamente gestito rischia anche di mostrare il nome della tabella in questione.
Per gli utenti più esperti la soluzione ideale sarebbe quella di fare un parsing della stringa in input e controllare che non vi siamo annidati all’interno tag di qualsiasi genere.




Utenti connessi: 7993