di Jacopo Sabbadini

Uno degli attacchi più semplici che si possono portare contro un database è sicuramente il cosiddetto SQLInjection, che consiste nel utilizzare il linguaggio SQL per accedere ai dati di un database.
Facciamo un attimo di chiarezza su cosa sia un form e come funzioni a livello di backend del database; in poche parole, il form è l’interfaccia che vede l’utente, in cui inserisce i propri dati (ad esempio nome, cognome, data di nascita, password e via discorrendo) al momento della registrazione su un sito, o al momento del login sul sito stesso. Questi dati inseriti dall’utente vengono trattati dal database ed inseriti all’interno dello stesso, utilizzando la sintassi propria del database in esame (nel nostro caso SQL per un database scritto in MySQL).
Appare immediatamente evidente un problema: come fa la macchina a distinguere nel momento in cui viene digitata una stringa nel campo del form, tra una stringa che deve inserire all’interno del database (ad esempio il nome) e un comando nel proprio linguaggio?
Qui è necessaria la corretta configurazione del form, vi sono vari tools che permettono di filtrare quanto viene scritto dall’utente, in modo tale che qualsiasi cosa scriva non verrà mai interpretata come un comando.
Se questa precauzione però non viene presa, si rende l’intero database vulnerabile ad un injection, cioè l’inserimento dall’esterno di un comando.
A titolo dimostrativo useremo una macchina virtuale appositamente costruita con questa vulnerabilità.
Iniziamo con registrare un nuovo utente, lo chiameremo Pippo, password Topolino, signature Paperino

 

Una volta creato il nostro nuovo utente, vediamo come normalmente risponde il database ad una query normale, cioè inserendo i corretti parametri per username e password

 

Come si può vedere, nulla di strano, mi viene restituito a video un riepilogo delle informazioni inserite.
Vediamo però cosa succede se cambiamo leggermente il nostro username, e aggiungiamo un ‘, cioè un apice, alla fine del nome. Se il form fosse correttamente settato, dovrebbe semplicemente restituirci un errore in quanto non esiste nessun utente con lo username Pippo’.

 

 

In realtà ci viene restituita una videata in cui ci dice che il codice che abbiamo inserito contiene un errore, nello specifico: Query: SELECT * FROM accounts WHERE username=’Pippo ” AND password=” (0) [Exception]
Questo ci fa capire che in realtà il form non era correttamente configurato, e il database va in errore in quanto il comando che gli è stato dato non era sintatticamente corretto.
A questo punto, possiamo provare a passare un comando che riconosca come sintatticamente corretto, ad esempio dicendogli di cercare tutti i campi in cui il nome utente sia Pippo, oppure di mostrare a video tutti i campi in cui una condizione che sappiamo essere sempre vera (nell’es 1=1) appaia; questa condizione sarà ovviamente vera per ogni riga del database, e questo è il risultato:

 

Andando in errore il database, stampa a video TUTTE le linee al suo interno, comprensive di username e password. Questa tecnica può essere utilizzata per carpire non solo informazioni dalle tabelle di un database, ma anche per portare ulteriori attacchi al server stesso; la prima linea che ci viene stampata è infatti un utente con username admin e password admin; si potrebbe provare a connettersi direttamente al server usando queste credenziali, per prenderne il controllo, e per iniziare un’escalation di permessi.

Per concludere quindi, sempre controllare che le interfacce utente siano correttamente settate, altrimenti il backend più sicuro al mondo può essere bypassato con estrema semplicità.