Premessa
Il linguaggio SQL (Structured Query Language), che permette di interagire con i Database, è un linguaggio dichiarativo che non specifica la sequenza di operazioni da compiere per ottenere il risultato.
Gli elementi caratteristici del linguaggio sono:
-
Definizione dei dati (DDL, Data definition Language), per definire i tre livelli della base dati: esterno, logico e fisico.
-
Aggiornamento dei dati (DML, Data Manipulation Language), per inserire, modificare o cancellare le informazioni nella base di dati.
-
Interrogazione sui dati (QL, Query Language), per interrogare la base di dati al fine di estrarne le informaizoni desiderate.
-
Controllo dell'accesso ai dati (DCL, Data Control Language), per definire le regole e i livelli di accesso ai dati.
Le query di SQL rappresentano lo strumento per poter creare e modificare la struttura del database ed inserire, modificare o visualizzare i dati presenti in database.
Le pagine web dinamiche utilizzano le query per interfacciarsi con i motori SQL.
SQL Injection
L'SQL injection consiste, essenzialmente, in un attacco informatico che sfrutta debolezze di una procedura, per costringerla ad eseguire query iniettate tramite le interfacce di input.
In questa sede tratteremo gli attacchi SQL a pagine WEB dinamiche.
L'attacco più diffuso sfrutta la cattiva pratica di concatenare stringhe sql, destinate ad interrogare il database; esso mira a sfruttare le concatenazioni per "iniettare" l'istruzione , al fine di ottenere le informazioni desiderate. Con questo tipo di attacco è possibile accedere ai dati contenuti nelle tabelle, modificarli e sopratutto creare, modificare ed eliminare strutture.
Si riporta di seguito una query di esempio inserita in una pagina web di autenticazione:
'Select * from logins where user=’ & $utente & ‘ AND password=’ & $password & ‘'
I campi utente e password provengono da una form. Chi ha intenzione di procedere all'attacco utilizzera questi campi per ottenere informazioni sulla base dati da poter sfruttare per i propri scopi.
Facciamo qualche esempio:
Esempio 1 - Inserendo come utente e password rispettivamente pippo e paperino ed inviando i dati alla form, poiché i dati non sono presenti in tabella, la query restituirà un resultset vuoto.
Esempio 2 - Inserendo invece come dati pippo paperino' , nel caso in cui il programmatore sia stato poco accorto, la pagina risponderà con un errore, causato dall'apice inserito alla fine della password. In tal modo saranno visualizzati il tipo di database utilizzato, e il codice che ha sollevato l'eccezione, fornendo informazioni utili per proseguire nell'attacco.
Esempio 3 - Il terzo test invece consiste nell'inserire le seguenti stringhe: pippo, paperino 'having 1=1--.La pagina risponderà con un errore del tipo "Messaggio 8120, livello 16, stato 1, riga 2 La colonna 'dbo.logins.ID' non è valida nell'elenco di selezione perché non è inclusa né in una funzione di aggregazione né nella clausola GROUP BY." In questo modo si ottengono infromazioni sul nome della tabella e del primo campo! Utilizzando la clausola group by con i nomi dei campi che man mano si ottengono, si riuscirebbe ad ottenere l'elenco completo dei campi.
Questo tipo di attacco è uno dei più banali; prossimamente saranno presentate altre tecniche di injection, exploit, brute force attack, finalizzare a bucare un sito web non sicuro.