Cosa sono gli attacchi SQL Injection e come prevenirli?

Condividi questo articolo:


Con il progresso della tecnologia, la società moderna ha raggiunto molti obiettivi impensabili. Tuttavia, con lo sviluppo della tecnologia, si sviluppa anche il rischio che comporta il suo utilizzo. Lo stesso vale per le applicazioni web. Le applicazioni di oggi sono irte di vulnerabilità. Dal 2003, SQL Injection è rimasto nella Top ten dell’OWASP Top ten dei rischi per la sicurezza delle applicazioni con cui le aziende stanno lottando. In questo articolo, esploreremo l’attacco SQL Injection e i modi per prevenirlo.

Diamo un’occhiata agli argomenti trattati in questo articolo:

  • Cos’è l’attacco SQL Injection Attack?
  • Cosa può fare un SQL Injection?
  • Come funzionano gli attacchi SQL Injection?
  • Quali sono i diversi tipi di attacchi SQL Injection?
  • Come si può prevenire un attacco SQL Injection Attack?
  • Potete assistere a questa video conferenza sulla sicurezza informatica in cui il nostro esperto di formazione sta discutendo ogni singolo dettaglio della tecnologia.

Cos’è l’attacco SQL Injection Attack?

SQL Injection (SQLi) è un attacco ad iniezione in cui un aggressore esegue dichiarazioni SQL dannose per controllare il server di database di un’applicazione web, accedendo, modificando e cancellando così dati non autorizzati.

Nei primi tempi di Internet, la costruzione di siti web era un processo semplice: niente JavaScript, no, CSS e poche immagini. Ma man mano che i siti web acquisivano popolarità, cresceva l’esigenza di una tecnologia più avanzata e di siti web dinamici. Ciò ha portato allo sviluppo di linguaggi di scripting lato server come JSP e PHP. I siti web hanno iniziato a memorizzare gli input e i contenuti degli utenti in banche dati. MySQL divenne il linguaggio più popolare e standardizzato per l’accesso e la manipolazione di banche dati. Tuttavia, gli hacker hanno trovato nuovi modi per sfruttare le lacune presenti nella tecnologia SQL. L’attacco SQL Injection è uno dei modi più diffusi per colpire le banche dati. SQL Injection prende di mira i database utilizzando istruzioni SQL appositamente create per indurre i sistemi a fare cose inaspettate e indesiderate.

Cosa può fare SQL Injection?

Ci sono molte cose che un aggressore può fare quando sfrutta un SQL Injection su un sito web vulnerabile. Sfruttando una vulnerabilità SQL Injection, date le giuste circostanze, un attaccante può fare le seguenti cose:

  • Bypassare i meccanismi di autorizzazione di un’applicazione web ed estrarre informazioni sensibili
  • Controllare facilmente il comportamento dell’applicazione che si basa sui dati presenti nel database
  • Iniettare ulteriore codice dannoso da eseguire quando gli utenti accedono all’applicazione
  • Aggiungere, modificare e cancellare dati, corrompendo il database e rendendo l’applicazione o inutilizzabile
  • Enumerare i dati di autenticazione di un utente registrato su un sito web e utilizzare i dati in attacchi ad altri siti
  • Tutto dipende dalla capacità dell’aggressore, ma a volte un attacco SQL Injection può portare a un’acquisizione completa del database e dell’applicazione web. Ora, come fa un aggressore a raggiungere questo obiettivo?

Come funzionano gli attacchi SQL Injection?

Uno sviluppatore di solito definisce una query SQL per eseguire alcune azioni di database necessarie al funzionamento della sua applicazione. Questa query ha uno o due argomenti, in modo che vengano restituiti solo i record desiderati quando il valore di quell’argomento viene fornito da un utente.

Un attacco SQL Injection si svolge in due fasi:

  • Ricerca: L’attaccante fornisce alcuni valori casuali inattesi per l’argomento, osserva come l’applicazione risponde e decide di tentare un attacco.
  • Attacco: Qui l’attaccante fornisce un valore accuratamente elaborato per l’argomento. L’applicazione interpreta la parte di valore di un comando SQL piuttosto che i soli dati, il database esegue poi il comando SQL modificato dall’attaccante.
    Si consideri il seguente esempio in cui un utente di un sito web è in grado di modificare i valori di ‘$user’ e ‘$password’, ad esempio in un modulo di login:

1

$statement = "SELECT * FROM users WHERE username ='$user'  AND  password '$password'";

Questa particolare istruzione SQL viene passata ad una funzione che a sua volta invia la stringa al database collegato dove viene analizzata, eseguita e restituisce un risultato.

1

2

3

4

5

6

7

8

9

#Define POST variables

uname = request.POST['username']

passwd = request.POST['password']

#SQL query vulnerable to SQLi

sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”

#Execute the SQL statement

database.execute(sql)

Ora, se l’ingresso non è correttamente igienizzato, ma l’applicazione, l’aggressore può facilmente inserire come input un valore accuratamente realizzato. Per esempio qualcosa come:

1

$statement = "SELECT * FROM users WHERE username ='Dean' OR '1'='1'-- ' AND password = 'WinchesterS'";

Allora, cosa sta succedendo qui? La parte evidenziata è l’input dell’aggressore, contiene 2 parti speciali:

OPPURE ‘1’ = ‘1’ è una condizione che sarà sempre vera, quindi è accettata come un input valido dall’applicazione
-(doppio trattino) indica al parser SQL che il resto della riga è un commento e non deve essere eseguito
Una volta eseguita la query, l’SQL injection rimuove efficacemente la verifica della password, con conseguente bypass di autenticazione. L’applicazione molto probabilmente registrerà l’aggressore con il primo account dal risultato della query – il primo account in una banca dati è di solito di un utente amministrativo.

Si noti che questo è solo un modo per sfruttare le query SQL per ottenere le informazioni necessarie in modo non ufficiale. Gli attacchi SQL Injection sono suddivisi in più tipi.

Quali sono i diversi tipi di attacchi SQL Injection?

Gli aggressori possono estrarre dati dai server sfruttando la vulnerabilità SQL Injection in vari modi. SQL Injection può essere classificato in tre categorie principali:

SQL Injection in banda

È l’attacco SQL Injection più comune. Di solito si verifica quando un aggressore è in grado di utilizzare lo stesso canale di comunicazione sia per lanciare l’attacco che per raccogliere i risultati. I due tipi più comuni di SQL Injection in-band sono i seguenti:

SQL Injection basato su errori – È una tecnica che si basa su messaggi di errore lanciati dal server del database per ottenere informazioni sulla struttura del database. Talvolta, questo semplice attacco è più che sufficiente per un aggressore per enumerare un intero database.
Union-based SQL Injection – Questa tecnica sfrutta l’operatore SQL UNION per combinare i risultati di due o più istruzioni SELECT in un unico risultato che viene poi restituito come parte della risposta HTTP.
Iniezione SQL Inferenziale (Blind SQLi)

In questo tipo di iniezione, nessun dato viene effettivamente trasferito tramite l’applicazione web. In questo modo l’aggressore non sarà in grado di vedere il risultato di un attacco. In questo caso l’aggressore ricostruisce la struttura della banca dati inviando carichi utili, osservando la risposta dell’applicazione web e il comportamento del server della banca dati che ne risulta. I due tipi di iniezione SQL inferenziale sono i seguenti:

SQL Injection basato su booleano – In questa tecnica l’applicazione è costretta a restituire un risultato diverso a seconda che la query restituisca un risultato VERO o FALSO. In base al risultato, il contenuto all’interno della risposta HTTP cambierà, o rimarrà lo stesso.
Time-based SQL Injection – È una tecnica che si basa sull’invio di una query SQL al database che costringe il database ad attendere un determinato periodo di tempo (in secondi) prima di rispondere. Il tempo necessario per rispondere indica all’aggressore se il risultato della query è VERO o FALSO.
Iniezione SQL fuori banda

Questi tipi di attacchi SQL Injection sono i meno comuni e generalmente i più difficili da eseguire. Di solito comportano l’invio dei dati direttamente dal server del database a una macchina controllata dall’aggressore. Le tecniche fuori banda offrono all’aggressore un’alternativa agli attacchi In-band o Blind SQL Injection, soprattutto se le risposte del server non sono molto stabili.

I linguaggi di scripting del server non sono quindi in grado di determinare se la stringa di query SQL è malformata o meno. Tutto ciò che possono fare è inviare una stringa al server del database e attendere la risposta interpretata. Ma sicuramente ci devono essere dei modi per sanificare l’input dell’utente e garantire che un’iniezione SQL sia impossibile, giusto?

Come si può impedire l’SQL Injection?

Ci sono molti modi semplici per evitare di cadere preda degli attacchi SQL Injection e per limitare i danni che possono causare. Pochi di questi includono:

Scoprire le vulnerabilità di SQL Injection testando di routine le applicazioni sia con test statici che dinamici
Evitare e riparare le vulnerabilità di iniezione utilizzando query parametrizzate e Object Relational Mapper (ORM). Questo tipo di query specifica dei segnaposto per i parametri in modo che il database li tratti sempre come dati piuttosto che come parte di un comando SQL.
Rimediare alle vulnerabilità SQL Injection utilizzando caratteri di escape in modo che i caratteri speciali vengano ignorati.
Mitigare l’impatto delle vulnerabilità SQL Injection applicando il minor privilegio possibile sul database, in questo modo ogni componente software di un’applicazione può accedere e influenzare solo le risorse di cui ha bisogno.
Utilizzare un Web Application Firewall (WAF) per le applicazioni web che accedono ai database. Questo può aiutare a identificare i tentativi di SQL injection e a volte aiuta ad evitare che anche i tentativi di SQL injection raggiungano l’applicazione.

 

Hai bisogno di informazioni, una consulenza o un preventivo ?
Compila il form e illustrami il tuo progetto


Condividi questo articolo: