L’attacco “Sql injection”

Guzzo Antonio 08/01/09
Scarica PDF Stampa
Tra le tecniche di hacking utilizzate dai pirati informatici una delle più recenti ed in rapida diffusione relativamente ad applicazioni Web Database è quella delle Sql Injection, ovvero l’inserimento ed esecuzione di codice Sql non previsto all’interno di una pagina web dinamica. A differenza di molte tecniche di hacking le Sql Injection non richiedono l’uso di particolari strumenti, né di approfondite conoscenze nel campo delle Reti di calcolatori. L’unica cosa di cui si ha bisogno per poter effettuare un’injection è di un computer collegato ad Internet ed un qualunque browser web tra quelli in circolazione. Le Sql Injection sfruttano la possibilità di poter inviare al server tramite una richiesta http uno o più parametri che saranno elaborati dal server per fornire all’utente il tipo di servizio desiderato. Molto spesso questi parametri sono utilizzati dalla pagina web per comporre una query Sql con la quale interrogare un database; introducendo come parametri dei frammenti di codice Sql opportunamente scelti è possibile quindi modificare o addirittura stravolgere il significato della query eseguita dal server web, consentendoci così di eseguire azioni normalmente proibite all’utente comune. Le tecniche di Sql Injection risultano inoltre del tutto indistinguibili dal normale traffico di rete, vanificando così molte delle misure di sicurezza tradizionali come l’analisi ed il controllo del traffico di rete o il monitoraggio delle porte. La principale differenza tra le altre tecniche di hacking e le Sql Injection consiste quindi nel fatto che queste ultime operano sull’applicazione web stessa, anziché coinvolgere livelli di comunicazione più bassi o altri servizi che operano nel sistema operativo che ospita il server web. Le possibilità offerte dall’uso di queste tecniche sono innumerevoli; oltre a fornire accesso ad informazioni riservate ed a qualunque altro tipo di operazione si voglia eseguire su database, consentono di entrare in aree private di siti web, assumere identità di altre persone reali o fittizie, manipolare il server stesso o facilitare l’esecuzione di tecniche di hacking di tipo diverso. Il rischio di esposizione alle tecniche di Sql Injection non dipende dalla tecnologia né dal tipo di hardware utilizzato. Non è possibile creare un server che sia virtualmente a prova di injection perchè queste tecniche sfruttano semplicemente le regole della sintassi Sql stessa e la loro flessibilità, caratteristiche proprie del linguaggio che non possono essere corrette o eliminate come se fossero un difetto. Come accennato in precedenza, il fenomeno delle Sql Injection non riguarda un’architettura web particolare, bensì interessa qualunque tecnologia utilizzata per realizzare pagine web dinamiche che si interfacciano con un database. L’applicazione web potrebbe ad esempio essere realizzata in linguaggio PHP o ASP, senza che le differenti sintassi utilizzate determinino in qualche modo un maggiore o minore rischio di injection. Allo stesso modo la scelta del server Sql con cui interfacciarsi non influenza di molto la sicurezza dell’applicazione. E’ necessario notare però che ogni tipo di server come ad esempio Oracle, Sql Server o MySql utilizza una propria versione del linguaggio Sql, che presenta alcune differenze sintattiche rispetto alle altre; non è detto quindi che un attacco effettuato contro un determinato tipo di server sia ugualmente efficace anche contro sistemi di tipo diverso. Nella maggioranza dei casi però è possibile adattare la forma di una Sql Injection a vari tipi di sintassi; inoltre qualunque sia il “dialetto” Sql utilizzato questo presenterà sempre degli elementi che potranno essere utilizzati a vantaggio dell’hacker. Lo studio delle tecniche di Sql Injection è quindi maggiormente focalizzato sulla sintassi del Transact-Sql, ovvero il “dialetto” Sql impiegato da MS SQL Server.
 
Classificazione delle Tecniche di Sql Injection
Lo studio delle tecniche di Sql Injection riguarda un campo molto flessibile e sottoposto a continue introduzioni di nuovi elementi; gli stessi semplici principi di base possono essere utilizzati per assemblare injection molto diverse tra loro per funzionamento ed obiettivo. Difficilmente un hacker sfrutterà una sola di queste tecniche per raggiungere i suoi scopi; un attacco effettuato tramite Sql Injection può richiedere anche diversi giorni di preparazione e molti attacchi si basano su diversi tipi di injection combinate tra loro. Con queste premesse cercare di classificare le varie tipologie di injection non è un’operazione semplice, per cui è necessario adottare una suddivisione in categorie generiche che racchiudano tecniche concettualmente simili, pur tenendo presente che tali divisioni possono non essere nettamente marcate. A tal fine si è deciso di suddividere le tecniche di Sql Injection in cinque categorie:
1) Tecniche di Sql injection di base
Si tratta dei principi di base con i quali vengono realizzate tutte le altre tipologie di injection. In particolare riguardano l’uso di congiunzioni logiche, caratteri di commento, separatori ed in generale altri elementi della sintassi Sql al fine di manipolare a proprio piacimento il significato delle query eseguite da un’applicazione web. Tra le tecniche di base sono presenti inoltre numerosi accorgimenti utilizzabili per creare enunciati Sql perfettamente equivalenti a quelli di partenza, ma in grado di aggirare molte delle contromisure più semplici. Una delle tecniche fondamentali su cui si basano molte altre tecniche più complesse consiste semplicemente nell’introdurre una condizione sempre vera nella clausola where della query, in modo da ottenere l’intera tabella tra i risultati.
2) Tecniche di SQL injection avanzate
Questa categoria racchiude le principali tipologie di attacco tramite injection, soprattutto quelle che riguardano la manipolazione del database e del server su cui esso risiede. I principi base fin qui descritti vengono ora impiegati per realizzare injection che abbiano un reale interesse per l’hacker, come ad esempio l’introduzione di file nel server o l’esecuzione di procedure personalizzate.
3) Tecniche di investigazione di base
Per effettuare un qualunque tipo di injection è necessario prima effettuare alcune ricerche preliminari, al fine di ottenere informazioni preziose per la composizione della injection voluta. Questa categoria riguarda le osservazioni preliminari necessarie per determinare i funzionamento del sistema sotto attacco e quali elementi di base siano utilizzabili o meno per la composizione delle altre tecniche. Come accennato in precedenza, l’investigazione di base non è costituita da tecniche di injection vere e proprie, quanto piuttosto dall’insieme di osservazioni preliminari necessarie per un qualunque attacco con Sql Injection. Le prime osservazioni fondamentali riguardano la struttura dell’applicazione web da attaccare, alla ricerca di form di inserimento e di altri parametri inviati a pagine dinamiche. Una volta trovati i possibili punti di accesso per le injection si può proseguire  con i controlli successivi.
4) Tecniche di investigazione avanzate
A differenza delle tecniche precedenti, queste hanno la funzione di ottenere informazioni riservate presenti nel database, quali ad esempio la struttura del database, nomi di colonne, tabelle, oppure i dati contenuti in esse. Tali tecniche possono essere di grande aiuto nella composizione di altre injection più invasive o più mirate. Un hacker difficilmente riuscirà a creare gravi danni ad un sistema senza conoscerne la struttura; sfortunatamente esistono numerose tecniche di investigazione che consentono di risalire a tale struttura a partire dai messaggi d’errore restituiti da un determinato applicativo web in caso di inserimenti anomali.
5) Tecniche di Blind SQL injection
Sono particolari tecniche di injection alle quali un hacker è costretto a ricorrere nel caso in cui le normali tecniche di investigazione si rivelino del tutto inutilizzabili; questo avviene nel caso in cui ogni messaggio d’errore o di risposta potenzialmente utile all’hacker sia stato rimosso e quest’ultimo si trovi a dover tentare delle injection “alla cieca”. Molti degli esempi riportati di seguito a scopo esplicativo sono stati realizzati di persona, sulla base di pagine web dinamiche create appositamente. Sono così definite quelle injection eseguite su applicazioni web che nascondono all’hacker ogni tipo di informazione utile contenuta nei messaggi di errore. Generalmente applicazioni di questo tipo si occupano di sostituire gli errori restituiti dal server con pagine realizzate appositamente dai programmatori, oppure non presentano nessuna pagina del genere. Le tecniche di blind sql injection assumono quindi come condizione di partenza l’assoluta mancanza di informazioni riguardo alla struttura del database, il tipo di sistema utilizzato, le tabelle e gli altri oggetti utilizzati dall’applicazione. Nonostante tutte queste informazioni siano occultate, l’applicazione web consente comunque di distinguere tra query eseguite correttamente (che mostrano cioè un qualche risultato) e query invece che generano una richiesta non valida (nessun risultato). E’ possibile inoltre in alcuni casi imparare a capire se le richieste ritenute non valide siano dovute ad errori di sintassi SQL (errori server) oppure no (ad esempio, username e password non  corrette) ricorrendo a programmi che intercettano il traffico di rete.
 
Metodologie di Prevenzione
Negli ultimi anni si è rivelato quindi necessario sviluppare contromisure e linee guida di  programmazione da seguire nella progettazione di applicazioni web per riuscire a contrastare efficacemente questo fenomeno in forte espansione. Passeremo ora ad esaminare le specifiche misure di sicurezza e le fondamentali linee guida di progettazione che devono essere tenute in considerazione nel realizzare un’applicazione web, al fine di scongiurare il pericolo di injection. Le SQL injection sono tecniche di hacking molto diverse rispetto a quelle tradizionali. Si basano semplicemente sulla sintassi sql e sulle query eseguite da applicazioni web basate su pagine dinamiche (php, asp, eccetera). In questi casi le tradizionali misure di sicurezza come ad esempio l’uso di Secure Socket Layer (SSL) e IP Security (IPSec) si rivelano completamente inutili. Ogni input fornito da utente potrebbe rivelarsi potenzialmente pericoloso. L’unico modo per scongiurare questo pericolo è prestare particolare attenzione alla realizzazione di un determinato applicativo web, cercando di valutare ogni potenziale fonte di pericolo non eliminabile dal codice e ovviando ad ognuna di essa con un’appropriata contromisura. Le quattro linee guida fondamentali da seguire sono:
1. Validazione dell’input (ovverossia provvedere a controllare il tipo dei dati ricevuti se ad esempio ci si aspetta un valore numerico, controllare che l’input sia un valore numerico);
2. Esecuzione di query all’interno di stored procedure;
3. Accesso ai dati effettuato da un utente con bassi privilegi;
4. Occultamento di informazioni che potrebbero facilitare il lavoro dell’hacker.
Nessuna di esse è sufficiente da sola a garantire l’inviolabilità di un’applicazione per cui si consiglia vivamente ad ogni realizzatore l’uso combinato di tutti questi principi, in modo da ottenere un livello di sicurezza ottimale.
 
a cura del Dottor Antonio Guzzo
Responsabile CED – Sistemi Informativi del Comune di Praia a Mare

Guzzo Antonio

Scrivi un commento

Accedi per poter inserire un commento