Che cos'è SQL Injection?

Definizione di SQL Injection 

SQL injection è un attacco che manipola illegalmente un database iniettando istruzioni Structured Query Language (SQL) indesiderate in un'applicazione che dispone di un database relazionale (RDBMS). Esistono diversi tipi di SQL injection a seconda del metodo e dello scopo e, dal punto di vista degli aggressori informatici, vanno dal furto di informazioni, alla falsificazione dei dati e all'indagine delle vulnerabilità. Sebbene si tratti di un vecchio attacco, oggi sta ancora causando molti danni, quindi è uno degli attacchi di cui le organizzazioni aziendali dovrebbero essere particolarmente diffidenti. 

Database relazionali e SQL 

Prima di entrare nella spiegazione di SQL injection, spieghiamo prima i database relazionali e SQL. Un database relazionale è un tipo di database che gestisce i dati delle applicazioni in un formato tabellare. Viene utilizzato in molte applicazioni aziendali a causa dell'elevata affidabilità delle transazioni (ogni singolo processo). 

SQL è un linguaggio (lingua del database) per l'utilizzo di database relazionali. Le operazioni sono ampiamente suddivise in tre categorie:  

  • Data Definition Language (DDL) per la configurazione del database 
  • Data Manipulation Language (DML) per la lettura e l'aggiornamento dei dati 
  • Data Control Language (DCL) per vari controlli come l'autorità 

Le specifiche per SQL sono stabilite da ISO. Pertanto, se si tratta di un database relazionale, in linea di principio, è possibile gestirlo nello stesso modo anche se il provider è diverso. 

Esempio di SQL Injection

Un giorno, un aggressore informatico scopre un'applicazione e la rende il bersaglio di un attacco. Supponiamo che l'aggressore informatico sappia che un utente legittimo "Ken Sato" esiste già su questa applicazione web. L'aggressore informatico tenta di accedere illegalmente fingendosi l'utente "Ken Sato". Nel modulo di accesso, l'aggressore informatico inserisce la stringa mostrata nella Figura 1. Se vista dal punto di vista dell'applicazione, viene generata l'istruzione SQL mostrata nella Figura 2. Come viene interpretata questa istruzione SQL in un database relazionale? 

image

Figura 1: Esempio di input utilizzati dagli aggressori informatici

image

Figura 2: Istruzione SQL creata dall'input nella Figura 1

Quando il database relazionale riceve questa istruzione SQL, cerca prima una riga nella tabella UTENTI in cui NOME UTENTE è "Ken Sato". Poiché il nome utente "Ken Sato" esiste già, il database relazionale passa alla condizione di ricerca successiva. È qui che inizia il problema. 

In base alla condizione di ricerca, il database relazionale cerca un utente il cui nome utente è "Ken Sato" e la cui password è "vuota" o "1" = "1". Poiché le password sono richieste in molte applicazioni, supponiamo che questa volta non sia stato trovato alcun utente con una password "vuota". Ma che ne dici di "1" = "1"? Questa è una formula che confronta se "1" e "1" sono uguali. Naturalmente, questo risultato è sempre vero. Pertanto, il database relazionale riconosce che esiste un utente il cui NOME UTENTE è "Ken Sato" e la cui PASSWORD è "vuota" o "1" = "1". Di conseguenza, il server del database risponde con le informazioni associate al nome utente "Ken Sato" al server dell'applicazione senza controllare la password per tale nome utente. L'application server crea una schermata di accesso riuscito basata su tali informazioni e le invia come risposta al browser dell'aggressore informatico. 

Questo è il meccanismo di base dell'iniezione SQL. Abbiamo fornito un accesso alle applicazioni web come esempio di facile comprensione, ma le operazioni del database che utilizzano istruzioni SQL vengono utilizzate in molte funzioni delle applicazioni. Pertanto, questo attacco può avere successo non solo nella schermata di accesso, ma in varie situazioni nell'applicazione. 

Tipi di attacchi SQL Injection

Esistono diversi tipi di iniezione SQL a seconda dello scopo e del metodo 

Iniezione SQL basata su errori

Si tratta di una tecnica di iniezione SQL utilizzata per esplorare le configurazioni e le vulnerabilità delle applicazioni. Un errore viene generato inserendo intenzionalmente un input non valido nell'applicazione e i dettagli del sistema di destinazione vengono esplorati in base al messaggio di errore. Sebbene la possibilità di falsificare o far trapelare direttamente i dati utilizzando questa tecnica sia bassa, gli aggressori informatici possono utilizzare le informazioni ottenute utilizzando questa tecnica per lanciare attacchi che prendono di mira vulnerabilità o altri attacchi SQL injection descritti di seguito. 

Iniezione UNION

Si tratta di una tecnica di iniezione SQL che utilizza l'operatore UNION, un tipo di SQL, per fare riferimento a dati arbitrari. L'operatore UNION è un operatore che combina i risultati di più affermazioni SELECT. Se un aggressore informatico aggiunge una nuova dichiarazione SELECT che inizia con l'operatore UNION a una dichiarazione SELECT emessa da un'applicazione, è possibile che l'applicazione ottenga dati non destinati dall'applicazione. Se l'attacco ha esito positivo, l'aggressore informatico può ottenere dati arbitrari a livello di tabella del database. Per questo motivo, è un metodo che può causare danni particolarmente gravi tra le iniezioni SQL. 

Iniezione SQL cieca

Si tratta di una tecnica di iniezione SQL che invia un'istruzione SQL a un'applicazione ed esplora la struttura dell'applicazione osservando le differenze di comportamento piuttosto che i risultati diretti. Come per l'iniezione SQL basata su errori, la possibilità di falsificare o far trapelare direttamente i dati utilizzando questa tecnica è bassa, ma gli aggressori informatici possono utilizzare le informazioni ottenute utilizzando questa tecnica per lanciare attacchi che prendono di mira vulnerabilità o altri attacchi di iniezione SQL. 

Iniezione SQL secondo ordine

Si tratta di una tecnica di iniezione SQL in cui un aggressore informatico invia un'istruzione SQL creata a un'applicazione inefficace al momento dell'esecuzione e la esegue successivamente. Poiché questa tecnica viene eseguita in un ambiente in cui non è previsto l'accesso diretto degli utenti, nello scenario peggiore potrebbe portare a intrusioni a livello di database, come modifiche alle impostazioni e alle autorizzazioni del database. 

Come prevenire gli attacchi SQL Injection

Le applicazioni di oggi sono composte da vari elementi. Pertanto, sono necessarie misure appropriate per ciascun elemento, in altre parole, una difesa a più livelli.  

Queste sono le misure principali per prevenire i danni causati dall'iniezione SQL. 

Misure a livello di database

Una contromisura a livello di database consiste nell'ottimizzare i privilegi utente sul database. Come accennato sopra, le operazioni di database relazionali sono ampiamente suddivise in tre categorie: Data Definition Language (DDL), che configura il database, Data Manipulation Language (DML), che legge e aggiorna i dati, e Data Control Language (DCL), che gestisce vari controlli come i privilegi. Tuttavia, in molti casi, DML come le clausole SELECT sono ciò che la maggior parte delle applicazioni utilizza normalmente. Limitando i privilegi per altre operazioni, è possibile impedire l'eliminazione involontaria dei dati e l'impostazione delle modifiche. 

Misure a livello di applicazione

Sono disponibili diverse contromisure a livello di applicazione.

  • Utilizzo dei segnaposto

È possibile impedire l'iniezione SQL creando istruzioni SQL utilizzando segnaposto. I segnaposto assegnano meccanicamente i valori di input alle istruzioni SQL preparate in anticipo dall'applicazione e, anche se vengono forniti valori non validi come input all'applicazione, essi sono valori non validi e la creazione dell'istruzione SQL finale viene interrotta

  • Corretta fuga dei valori di input

I simboli e le stringhe di caratteri che hanno significati speciali nelle istruzioni SQL vengono ignorati e trattati come normali stringhe di caratteri per impedire operazioni indesiderate del database relazionale. Esempi di caratteri che possono essere sfuggiti includono "`(citazione singola)", "; (semicolon/significativo: il simbolo in questione è considerato la fine dell'istruzione SQL)", "-- (due trattini consecutivi/significativo: il simbolo dopo che il simbolo è stato trattato come un commento)", e "UNION (clausola UNION/significativo: combina i risultati di due o più affermazioni SELEZIONATE)". Inoltre, nel caso di numeri come "1", è necessario definire esplicitamente se sono trattati come "numeri" o "caratteri" nel database e convertirli in modo appropriato.

  • Nascondi errori

I messaggi di errore visualizzati dalle applicazioni possono fornire molte informazioni agli aggressori informatici. Come descritto in "Error-Based SQL Injection", gli aggressori possono utilizzare questi messaggi per lanciare ulteriori attacchi. Quando si sviluppano applicazioni, è importante non visualizzare direttamente messaggi di errore che potrebbero portare a una comprensione dell'ambiente interno del sistema, non solo del database.

  • Applicazione di programmi patch ai sistemi di pacchetto

Se si utilizza un sistema di pacchetti, si consiglia di applicare la patch ufficialmente fornita dal fornitore il prima possibile. Ciò contribuirà a proteggere il sistema da varie vulnerabilità, tra cui SQL injection.

Misure a livello di rete

Le misure a livello di rete includono l'uso di IPS (Intrusion Prevention System) e WAF (Web Application Firewall). IPS è una soluzione che monitora la rete e rileva/blocca le comunicazioni dannose. WAF è una soluzione che protegge le applicazioni web e, ispezionando le comunicazioni web, rileva/blocca gli attacchi che prendono di mira le vulnerabilità delle applicazioni web. 

Misure a livello dell'ambiente operativo complessivo

Dopo aver implementato le misure di cui sopra, è possibile valutare obiettivamente l'efficacia delle misure e le eventuali carenze conducendo test di penetrazione esterni e valutazioni delle vulnerabilità. 

Differenza con lo scripting cross-site

Sebbene entrambe le vulnerabilità possano essere causate da codice dannoso o dati inviati da utenti e amministratori di siti web/app, esse differiscono in termini di impatto. CSS/XSS in genere causa interruzioni dal lato del cliente o del visitatore e può essere utilizzato per dirottare le sessioni, deturpare i siti web, scaricare contenuti dannosi e reindirizzare gli URL. D'altro canto, le iniezioni influiscono gravemente sul lato server e possono portare alla perdita di dati e ad altre conseguenze. 

Conclusione

Sebbene SQL injection sia un vecchio attacco, negli ultimi anni ci sono ancora molti casi confermati che causano grandi danni. Pertanto, è ancora un attacco di cui le organizzazioni dovrebbero fare attenzione. Se viene utilizzata una tecnica come l'iniezione UNION e l'attacco ha successo, potrebbe verificarsi una perdita di informazioni su larga scala. Tuttavia, adottando misure appropriate, è possibile prevenire tali danni prima che si verifichino. Come misura di sicurezza per le organizzazioni aziendali, oltre alle misure dal punto di vista della difesa in profondità sopra menzionate, consigliamo di eseguire regolarmente valutazioni di sicurezza, come test di penetrazione esterni e diagnosi di vulnerabilità.