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:

 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

Post popolari in questo blog

Hadoop, how to create a single node cluster using docker

How to install IOTA node with docker

Apache Spark - Try it using docker!