SQL Injection in semplici parole
INTRODUZIONE
Chi ha letto ultimamente le cronache pirandelliane di rousseau? Il "sistema operativo" targato movimento 5 stelle? Sicuramente chi ne avrà sentito ricorda la parola SQL Injection
L'SQL Injection è un attacco mai passato di moda. Anche oggi, dopo una ventina di anni, è sempre di attualità. Infatti non è colpa di un BUG del database ma la colpa è attribuibile solo all'ignoranza di chi scrive i software!
Per i non addetti ai lavori, una query SQL è una "domanda" da effettuare ad un sistema database per recuperare, inserire o modificare i dati scritti all'interno.
Un esempio di domanda è "Recupera tutti i codice fiscali dagli utenti maschi".
Questa query (domanda) viene tradotta in SQL (Structured Query Language) in
select codice_fiscale from utenti where sesso = 'M'
Di solito però una query viene eseguita a partire da un sito o applicazione. Quindi ai fini del nostro esempio, immaginiamo che la query sta a valle di una schermata dove occorre selezionare il sesso della lista di codici fiscali da estrarre.
Nota bene: I linguaggi di programmazione salvano le informazioni in variabili.
In quasi tutti i linguaggi, una parola (stringa) può essere unita ad un altra mediante l'operatore somma.
Nel nostro caso memorizzo la scelta fatta dall'applicazione in una variabile che chiamo variabile_sesso, la query quindi potrebbe diventare:
Nel nostro caso memorizzo la scelta fatta dall'applicazione in una variabile che chiamo variabile_sesso, la query quindi potrebbe diventare:
select codice_fiscale from utenti where sesso = ' + variabile_sesso + '
Ed ecco a voi la perfetta query per effettuare una SQL INJECTION
PRINCIPIO BASE
Il principio base su cui si basa una vulnerabilità del genere è proprio il concetto di "somma" di stringhe.
Utilizzando un altro esempio: ammettiamo che riesca a captare un messaggio importante e modificarlo prima che arrivasse al destinatario.
Il messaggio potrebbe essere del tipo: "Quando mi vedi arrivare, apri la porta". In questo caso apri è la nostra variabile.
Nella nostra ipotesi, potrei aggiungere una parte di frase al posto di apri cambiando la semantica dell'intera frase: "Quando mi vedi arrivare o suonare il clacson, apri la porta"
Quell'oppure è la chiave di volta dell'sql injection
QUALCHE ESEMPIO
Tornando all'estrazione dei codici fiscali nel caso in cui il programmatore ha usato la concatenazione di stringhe è molto probabile che si possa forzare il sistema.
Per testare se un sito sia affetto da questo bug è sufficente provare una serie di caratteri che di solito fanno rompere la query.
Se riesco a romperla vorrà dire che il sito probabilmente è attaccabile.
Supponiamo quindi che la nostra applicazione sia infetta da questo errore di programmazione, un malintenzionato potrebbe modificare a piacimento la query al fine di per recuperare tutti i codici fiscali (non solo quelli maschili)
select codice_fiscale from utenti where sesso = ' + variabile_sesso + '
Se variabile_sesso ha come contenuto una stringa del tipo: M' OR 1=1; '
La query finale eseguita sarà:
select codice_fiscale from utenti where sesso = 'M' OR 1=1; ''
Tradotta significa "Recupera tutti i codice fiscali dagli utenti che siano maschi oppure 1=1"
un oppure 1=1 rende vani tutti i possibili controlli fatti nella condizione della query restituendo TUTTI i dati del sistema.
COME PORRE RIMEDIO
I vari framework e linguaggi oramai sono abbastanza attrezzati per non cadere in questo pericolosissimo tranello. La regola generica che ogni programmatore deve seguire è di NON effettuare mai una concatenazione di stringhe all'interno della query
Occorrerà invece usare una query parametrica e usare i parametri sia perchè si è coperti di eventuali attacchi sql injection, sia perchè il database risulta più performante perchè vengono attivate logiche di ottimizzazione delle performance di esecuzione.
Commenti
Posta un commento