SQL Injection: cos’è e come prevenirla

Cosa è una SQL Injection?

“Iterum rudit leo” – questa la conclusione del report Akamai che, prendendo in esame i log del proprio WAF tra Novembre 2017 e Marzo 2019, sottolinea un trend in crescita a dir poco preoccupante: circa il 65% delle applicazioni considerate durante il periodo di 17 mesi è preso di mira da attacchi volti a sfruttare problematiche di tipo SQL Injection.
Nel corso di questo articolo verranno dunque analizzati i diversi tipi di SQL injection, quale è il loro impatto e infine come prevenire tali problematiche o almeno ridurne al massimo l’impatto finale.

Indice degli argomenti

  1. Quali sono le tipologie di SQL Injection?
  2. Qual è il massimo impatto ottenibile?
  3. Come prevenire le SQL Injection?

Secondo la classificazione presente nella OWASP Top 10, la SQL Injection (spesso abbreviata in “SQLi”) è una vulnerabilità server-side che ricade all’interno della categoria “A1 Injection” e identifica quella categoria di vulnerabilità che permettono l’iniezione di codice SQL all’interno di una query rivolta verso il backend, con la possibilità di alterarne il risultato ed eseguire comandi tipici della sintassi SQL adottata per interrogare il database.

Tipologie di SQL injection

Le SQL injection si differenziano tra loro in base alla tecnica adottata per esempio filtrare le informazioni dal database e sono dunque raccolte in 3 grandi macro categorie che al loro interno presentano divisioni ulteriori in base al vettore di attacco usato per eseguire il recupero del risultato ottenuto a partire della query richiesta.

Le 3 macrocategorie precedentemente citate sono le seguenti:

  • In-band SQLi: l’attaccante recupera le informazioni e le ottiene sfruttando lo stesso canale di comunicazione adottato per interrogare il database. In un caso pratico, dunque, se l’applicativo prevede la visualizzazione di un commento recuperato dal database, l’attaccante potrebbe manipolare la query che esegue tale task per ottenere la tabella contenente gli utenti del database all’interno del medesimo form di commento.
  • Inferential SQLi: anche definito “blind” (“cieco”), è una tipologia di SQLi per cui l’attaccante non riesce a visionare direttamente il contenuto ottenuto dalla manipolazione della query e analizza attentamente le risposte per ottenere, tramite inferenza, informazioni su quanto è stato recuperato dal DB.
  • Out-of-Band SQLi: in questo caso l’attaccante riesce ad esfiltrare i dati tramite un canale di comunicazione diverso rispetto a quello usato per alterare la query SQL, ad esempio sfruttando richieste DNS o HTTP eseguite tramite SQL verso il proprio server.

Qual è il massimo impatto ottenibile?

La SQL injection è forse una delle vulnerabilità più importanti e, malgrado l’impatto possa variare in base al punto di iniezione e alle difese in campo, è quasi sempre possibile raggiungere uno dei seguenti impatti:

  • Bypass di limitazioni imposte, per esempio dell’autenticazione in fase di login;
  • Esfiltrazione di informazioni sensibili come utenti e password o informazioni inerenti il database;
  • DoS tramite utilizzo di specifiche direttive per ritardare la risposta del database;
  • Esfiltrazione del contenuto di file o sovrascrittura di file esistenti;
  • Esecuzione di comandi sul server.

Come prevenire le SQLi?

Secondo la “OWASP SQL Injection Prevention Cheat Sheet” le migliori modalità per eliminare la possibilità di SQLi sono le seguenti:

  • Adottare “prepared statements” o eventualmente “stored procedures” in sostituzione delle query dinamiche;
  • Adottare un approccio di whitelisting che consiste nel definire nella logica dell’applicazione specifici valori che potrebbero essere ricevuti e ritornare un errore in caso venga inserito un valore inaspettato (notare che un approccio di tipo blacklisting sarebbe invece facilmente bypassabile);
  • Sanitizzare correttamente tutti gli input che vengono passati in una query SQL e codificare in esadecimale i relativi valori.

Alcuni suggerimenti per evitare che una SQLi possa raggiungere il suo massimo impatto invece sono:

  • Frammentare la gestione del DB tramite la creazione di più utenti con permessi specifici;
  • Abbassare i privilegi legati a determinati utenti ed eliminare l’accesso a tabelle aventi contenuto sensibile;
  • Non salvare mai in plaintext informazioni come password o pin, ma immagazzinarne l’hash in modo che sia più difficile risalire al dato originale;
  • Adottare WAF e IDS per tenere sotto controllo il perimetro e prevenire attacchi che sfruttino payload noti.

Conclusioni

La SQL injection è forse uno degli attacchi più diffusi e d’impatto di tutti i tempi: alcuni degli attacchi più famosi, come il data breach di 7-Eleven che nell’Ottobre del 2019 espose ben 130 milioni numeri di carte di credito, sono possibili tramite questa vulnerabilità che potrebbe potenzialmente essere presenti in molti dei software attualmente in uso. 

A livello di best practice, controllare l’input passato da un possibile attaccante, monitorare e mantenere bassi i privilegi sono solitamente gli ingredienti della strategia vincente per contrastare sufficientemente questo tipo di attacchi.