Ad oggi, la stragrande maggioranza delle applicazioni web sfrutta sistemi di database per immagazzinare e gestire i propri dati.

Tuttavia, la presenza di una gran mole di informazioni rilevanti concentrate in un solo punto spinge gli hacker ad attaccare queste strutture. Tra le offensive più note e longeve rientrano sicuramente le SQL Injection, sia a danno di aziende che privati.

Nell’articolo analizzeremo l’attacco, con particolare riferimento alla variante nota come Blind SQL Injection usata per sistemi che non mostrano i risultati delle query né messaggi d’errore.

Vedremo, inoltre, come fare prevenzione o difendersi in caso d’attacco.

blind sql injection
  1. Panoramica su SQL
  2. Cos’è una SQL Injection
  3. Cos’è una Blind SQL Injection
  4. Rischi e criticità legati alla Blind SQL injection
  5. Prevenzione e difesa
  6. Conclusioni

Panoramica su SQL

SQL (o “Structured Query Language”) è uno fra i più utilizzati linguaggi standard per la gestione delle basi di dati che operano con modelli relazionali. Esso raccoglie le informazioni in forma tabulare, ripartendo i dati fra righe e colonne, a seconda dei loro attributi e delle loro relazioni.

Tra i tanti campi di impiego, rientrano sicuramente le applicazioni Web, che utilizzano i database per immagazzinare tutte le informazioni necessarie al proprio funzionamento e gestirle mediante linguaggio SQL.

Esso permette di

  • creare nuovi schemi
  • modificare quelli già presenti
  • inserire nuovi dati
  • variarne gli attributi
  • interrogarli, etc.

L’insieme delle istruzioni in SQL che permettono all’utente di interfacciarsi con il database è detto API (o “Application Programming Interface”) e non fa altro che tradurre le richieste di input in un linguaggio comprensibile dall’applicativo web.

È proprio dall’incompleta o errata scrittura dei codici di queste API che nascono le maggiori criticità, sfruttate poi dagli hacker per insinuarsi all’interno dei database.

Cos’è una SQL Injection

La SQL Injection (o SQLi) è una tecnica di code injection utilizzata negli attacchi alle basi di dati per manipolarne il contenuto, sfruttando le criticità prima accennate.

A livello tecnico, con l’espressione code injection (letteralmente “iniezione di codice”) si intende una serie di procedure che permettono di controllare un software, l’iniettato, con un software iniettante. In questo modo, si altera il funzionamento dell’applicazione senza modificarne il codice sorgente.

Nel caso di SQL injections, gli hacker sfruttano la mancanza di controllo sugli input delle API che gestiscono i database. Immettendo delle stringhe apposite, essi possono:

  • alterare gli schemi
  • creare nuovi users
  • scaricare dati, etc.

Tra le varianti più note di SQLi troviamo:

  • in-band injections, in cui i risultati dell’attacco sono recuperati sul server dove è avvenuto
  • out-of-band injections, per le quali i risultati sono recuperati su un altro server
  • inferential injections (o “blind”)

Cos’è una Blind SQL Injection

La Blind SQL Injection è una tipologia di iniezione SQL effettuata sulle applicazioni web vulnerabili, ma che non mostra i risultati delle richieste fatte al database sull’interfaccia web dell’attaccante.

In questo caso, per comprendere la struttura e il funzionamento del sistema, chi muove l’attacco, “inietta” delle richieste di tipo logico insieme alle stringhe SQL originali.

Dall’analisi dei comportamenti dell’applicazione a questa serie di dichiarazioni vere o false, l’hacker è in grado di rilevare o meno delle vulnerabilità. Data l’assenza di risposte e di messaggi d’errore da parte del server, gli attacchi blind sono mediamente più complessi degli SQLi classici ma comunque possibili.

Le principali categorie di Blind SQLi sono due:

  1. quelle basate sul contenuto: attraverso degli statement veri e falsi aggiunti alla richiesta di un certo dato, l’attaccante rileva una criticità se i dettagli richiesti vengono mostrati o meno
  2. quelle basate sul tempo: l’attaccante trova la vulnerabilità basandosi sul tempo di risposta dell’applicazione alla query effettuata. Se, infatti, il server non replica prontamente alla richiesta, allora quella particolare stringa ha individuato un punto debole del codice dell’API.

Il tipo di blind SQLi time-based più utilizzate sono le sleep operation. In questo caso, l’attaccante inserisce un’istruzione di sleep() nella stringa di input, che verrebbe ignorata da un sistema con adeguate misure di sicurezza.

Se, invece, la risposta ritarda di un tempo pari a quello specificato nella sleep(), allora l’applicazione è vulnerabile.

Rischi e criticità legati alla Blind SQL injection

Nonostante la sua invenzione risalga agli anni 90’, si stima che circa un terzo degli attacchi ad applicazioni Web sia di questo tipo.

L’Owasp, organizzazione no profit che dal 2001 si occupa della sicurezza delle applicazioni, afferma che nel solo 2022 ci sono stati più di mille attacchi di tipo SQLi , e posiziona questa tipologia di vulnerabilità al terzo posto tra quelle relative ai sistemi web.

Solitamente le criticità sono responsabilità dei programmatori che non si accorgono dei punti deboli dei codici fino al primo tentativo di attacco. Molte volte, infatti, le SQLi vanno a buon fine perché sono degli attacchi zero-day.

Tra le altre cause rientra sicuramente la mancanza di test automatizzati che permettano la rilevazione precisa delle injection. Anche la grande quantità di database SQL utilizzati fornisce agli hacker un’ampia superficie d’attacco, poiché l’accesso alle librerie da parte delle basi di dati dovrebbe essere sicuro.

I rischi dovuti ad attacchi del genere sono molteplici, ad esempio, i dati possono essere

  • inseriti
  • alterati
  • eliminati

per bloccare l’esecuzione dell’applicazione, in un’operazione DoS (o “Denial of Service”).

Altre volte, i dati possono essere momentaneamente sequestrati e rilasciati solo dopo il pagamento di un riscatto, in un’offensiva simil ransomware. Altre volte ancora, le informazioni vengono rivendute a terzi (eventualmente a broker informatici).

Inoltre, gli attaccanti possono riservarsi la possibilità di accesso al server a tempo indeterminato tramite backdoor, e, in casi particolari, possono assumere il controllo completo del database.

Infine, uno dei rischi maggiori è sicuramente la perdita di affidabilità dell’applicazione, che non risulta più sicura agli occhi degli utenti. con possibili danni di immagine oltre che perdite pecuniarie.

Il server a quel punto non è più ritenuto attendibile, così come i dati al suo interno.

Prevenzione e difesa

Per quanto concerne la prevenzione della Blind SQL injection, che sul piano informatico non è molto complesso, è necessario innanzitutto eseguire regolari Penetration Test.

Solo mettendo alla prova il programma con delle simulazioni di attacco si è in grado di capire la presenza o meno di vulnerabilità al suo interno. Molto spesso si tratta di un mancato controllo sull’input, che è cruciale in quanto permette a chi attacca di infiltrarsi con procedure relativamente semplici.

A livello di programmazione, è possibile introdurre dei parametri per rendere l’istruzione eseguita nel database indipendente dall’input esterno. Questa operazione di “ripulitura” del codice, detta in gergo tecnico, prepared statements permette all’applicazione di distinguere fra

  • i dati di immissione (ovvero la richiesta legittima)
  • i comandi inseriti dall’attaccante

Si deve evitare, tuttavia, che delle alterazioni di questi parametri possano dar vita ad errori, per cui si rende necessaria una procedura di settaggio sicura.

Oltre a ripulire il codice, è doveroso agire similmente sugli input, che devono essere filtrati (soprattutto dai caratteri speciali) e resi puri.

Preferire poi le whitelist alle blacklist dei caratteri inseribili. Queste ultime, infatti, impediscono agli utenti l’inserimento di caratteri problematici, mentre le altre restringono il campo dei caratteri inseribili, dando più filo da torcere agli hacker.

A livello di sviluppo ci sono ulteriori metodi ed espedienti per prevenire le vulnerabilità, come:

  • la crittografia delle informazioni nel database per renderle incomprensibili a chi tenti di rubarle
  • WAF (o Web application firewall) che è un sistema in grado di filtrare il traffico tra l’applicazione web ed Internet.

Va da sé che, specialmente in contesti aziendali, l’utilizzo di un buon software di sicurezza da tenere sempre aggiornato può fare la differenza. Molto spesso, infatti, questi software sono in grado di applicare automaticamente le patch che garantiscono la protezione da attacchi come le SQL injections.

Dal punto di vista dell’utente, ci sono alcuni accorgimenti che è possibile mettere in pratica per evitare che i propri dati vengano violati in seguito ad attacchi SQLi.

Tra questi:

  • verificare sempre la sicurezza di un sito, notando, ad esempio, se il protocollo web utilizzato è https (più sicuro di http)
  • impostare password altamente sicure e complesse

Conclusioni

Le SQL injection, anche nella loro variante Blind, costituiscono ancora oggi una minaccia per molti sistemi. Nonostante la relativa semplicità della procedura e il fatto di essere nota da tempo, essa riesce ancora a dominare le classifiche relative agli attacchi più effettuati.

Le basi di dati sono, ad oggi, il sistema più usato per l’archiviazione e gestione dei dati delle applicazioni web.

Proteggerle è fondamentale per preservare l’integrità del server e delle informazioni in esso contenute.

Sta dunque agli sviluppatori fare in modo che eventuali hacker non siano in grado di carpire alcunché (né dati, né struttura), rendendo il codice il più sicuro possibile e prestando particolare attenzione alla validazione degli input.