SQL Injection SQLi

Un attacco web in cui qualcuno scrive comandi per il database in un modulo o in un indirizzo web, e il sito li esegue, rivelando, modificando o cancellando dati che dovrebbe proteggere.

Chiamato anche

Definizione

Cos'è la SQL injection

Hai un negozio online. Un visitatore scrive qualcosa di strano nella casella di ricerca, preme Invio e la pagina gli mostra nome, telefono e storico ordini di tutti i tuoi clienti. Nessuno ha rubato una password. Ha scritto le parole giuste nel posto sbagliato, e il tuo sito ha fatto il resto. Questa è la SQL injection.

La maggior parte dei siti conserva le proprie informazioni in un database: un archivio ordinato di tabelle, un po' come una raccolta di fogli di calcolo. Per leggere o cambiare queste informazioni, il sito usa un linguaggio chiamato SQL (Structured Query Language). Ogni richiesta che invia è una query, per esempio "trova il cliente che ha questa email".

La SQL injection avviene quando un sito prende ciò che scrive un visitatore e lo incolla così com'è dentro una di queste query. Se il visitatore scrive SQL invece di un testo normale, il database non nota la differenza ed esegue il comando di chi attacca come se l'avesse scritto il sito. Spesso il nome viene abbreviato in SQLi.

Come funziona un attacco di SQL injection

Pensa a un impiegato di banca che passa parola per parola agli addetti del caveau qualsiasi biglietto gli consegni un cliente. Un biglietto normale dice "mostratemi il mio saldo". Un biglietto furbo dice "mostratemi il mio saldo, e aprite anche tutte le cassette di sicurezza". Se l'impiegato non legge mai il biglietto prima, gli addetti del caveau obbediscono.

Su un sito web, i passaggi di solito sono questi:

  1. Chi attacca trova un punto che invia testo al database: un modulo di accesso, una casella di ricerca, un modulo di contatto o l'indirizzo web stesso, come la pagina di un prodotto che finisce con "?id=25".
  2. Scrive un piccolo pezzo di SQL al posto del testo normale. Un esempio noto è scrivere ' OR '1'='1 nel campo della password di un modulo di accesso.
  3. Il sito aggiunge quel testo alla propria query senza controllarlo. Ora la query chiede qualcosa come "fai entrare questa persona se la password è giusta, oppure se 1 è uguale a 1".
  4. Dato che 1 è sempre uguale a 1, il database risponde di sì, e chi attacca entra senza conoscere nessuna password.

Alcuni attacchi sono più silenziosi. Nella blind SQL injection la pagina non mostra alcun dato, quindi chi attacca fa al database domande a cui si risponde sì o no e guarda come reagisce la pagina, o quanto ci mette a caricarsi. A mano è un lavoro lento, ed è per questo che si usano strumenti automatici gratuiti che lo fanno al posto loro.

Cosa può fare chi attacca

Quando il database inizia a seguire i suoi comandi, il danno dipende da cosa può fare l'account del database usato dal sito. Spesso è molto più di quanto serva al sito. Chi attacca potrebbe riuscire a:

  • leggere dati privati, come nomi, indirizzi, email e storico ordini dei clienti, cartelle cliniche o password salvate
  • entrare come un altro utente, anche come amministratore
  • modificare dati, come prezzi, saldi o lo stato degli ordini
  • cancellare intere tabelle, o tutto il database
  • in alcune configurazioni, arrivare al server stesso e lasciarci file dannosi

Perché conta per la tua attività

La SQL injection è uno degli attacchi web più vecchi, ed è ancora in circolazione. OWASP, una comunità aperta che pubblica la nota lista OWASP Top 10 dei rischi per le applicazioni web, tiene l'injection in questa lista da anni. È facile da tentare, e molti siti hanno ancora qualche modulo dimenticato che la lascia passare.

Per chi guida un'attività, il vero costo raramente è tecnico. È una lista clienti finita in rete, un negozio che vende al prezzo sbagliato, un sistema di prenotazione che perde una settimana di appuntamenti o un messaggio che devi mandare ai clienti per dire che i loro dati sono stati esposti. In molti paesi, leggi sulla protezione dei dati come il GDPR ti chiedono anche di proteggere i dati personali e di segnalare le violazioni.

Ogni modulo del tuo sito è stato costruito tenendo conto di questo rischio? I siti messi insieme in fretta con vecchi plugin, o modificati da molte mani nel corso degli anni, nascondono più facilmente un punto debole.

Come proteggere un sito dalla SQL injection

La soluzione principale è ben nota, e funziona. Gran parte della protezione dipende da come è costruito il sito, quindi queste sono buone domande da fare ai tuoi sviluppatori o al tuo fornitore.

  • Prepared statement. Chiamati anche query parametrizzate. Il sito invia la query e il testo del visitatore separatamente, così il database tratta sempre quel testo come un semplice dato e mai come un comando. È la difesa principale. I framework moderni come Laravel lo fanno in automatico quando gli sviluppatori usano i loro strumenti integrati per il database.
  • Controllo dei dati inseriti. Un campo per il numero di telefono dovrebbe accettare solo cifre, e un campo data solo date. Rifiutare presto gli inserimenti strani chiude molte porte.
  • Privilegi minimi. L'account che il sito usa per accedere al database dovrebbe avere solo i permessi che gli servono. Una pagina di ricerca pubblica non ha alcun motivo per cancellare tabelle.
  • Messaggi di errore discreti. Un errore dettagliato del database sullo schermo regala una mappa a chi attacca. Mostra ai visitatori un messaggio breve e semplice e tieni i dettagli in log privati.
  • Aggiornamenti. Tieni aggiornati piattaforma, plugin e librerie, perché le versioni vecchie hanno spesso falle note.
  • Un web application firewall. È un filtro davanti al sito che blocca molti schemi di attacco noti prima che arrivino al tuo codice. Aiuta, ma non ripara il codice insicuro.
  • Test regolari. Il penetration test (un attacco sicuro e pianificato, fatto da esperti) e la scansione delle vulnerabilità trovano i punti deboli prima di chi attacca.

Ecco come si confrontano alcune abitudini quotidiane:

Abitudine rischiosaAbitudine più sicura
Unire il testo del visitatore direttamente nella queryUsare prepared statement per ogni query
Un solo account del database con tutti i permessi per tuttoUn account limitato per ogni parte del sito
Mostrare gli errori completi del database sulla paginaUn messaggio breve per i visitatori, i dettagli nei log privati
Plugin lasciati senza aggiornamenti per mesiAggiornamenti regolari e un elenco chiaro di ciò che è installato
Testare solo che le funzioni vadanoTestare anche cosa succede quando qualcuno scrive qualcosa di dannoso

Errori comuni

  • Fidarsi dei controlli nel browser. I controlli che girano sul dispositivo del visitatore sono facili da aggirare, quindi il server deve ricontrollare tutto.
  • Pensare che un sito piccolo sia al sicuro. Gli strumenti automatici passano in rassegna un numero enorme di siti senza badare alla loro dimensione.
  • Sistemare un modulo e dimenticare gli altri. La casella di ricerca, i filtri, l'indirizzo web e l'API dietro un'app per smartphone hanno bisogno della stessa attenzione.
  • Salvare le password in chiaro. Se i dati escono, le password salvate con un hash robusto (trasformate in un codice rimescolato che non si può rileggere) sono molto più difficili da sfruttare.
  • Affidarsi solo a un firewall. Un filtro fa guadagnare tempo. La query insicura che c'è dietro va comunque corretta.

Come possiamo aiutarti

In Linkysoft, la ricerca di SQL injection fa parte dei nostri servizi di cybersecurity. Facciamo attacchi simulati e sicuri sul tuo sito, sulla tua app e sulla tua API, rivediamo il codice e ti consegniamo un elenco in parole semplici con quello che abbiamo trovato e come correggerlo. Dopo le correzioni, testiamo di nuovo. Vale anche per i siti realizzati da altri team, e il controllo di sicurezza gratuito è un primo passo facile.

Stai pensando a un nuovo sistema? Le nostre applicazioni web e sistemi gestionali sono sicuri fin dalla progettazione, con rafforzamento secondo l'OWASP Top 10 e penetration test prima del lancio.

Domande su SQL Injection

Cos'è la SQL injection, in parole semplici?
È un trucco in cui qualcuno scrive comandi per il database in un modulo del sito o in un indirizzo web. Se il sito non controlla quel testo, il database esegue i comandi. A quel punto chi attacca può leggere, modificare o cancellare i dati.
Anche un sito piccolo può subire una SQL injection?
Sì. La maggior parte degli attacchi arriva da strumenti automatici che passano in rassegna i siti a caso, qualunque sia la loro dimensione. Qualsiasi sito con un modulo, una casella di ricerca o un database dietro può diventare un bersaglio.
Come faccio a sapere se il mio sito è vulnerabile alla SQL injection?
La via più sicura è un penetration test o una scansione delle vulnerabilità fatta da persone che sanno cosa cercare. Provano l'attacco in modo sicuro e ti dicono quali pagine sono esposte. Anche strani errori del database che compaiono sulle tue pagine sono un campanello d'allarme.
Qual è il modo migliore per prevenire la SQL injection?
Usa i prepared statement, chiamati anche query parametrizzate, per ogni query al database. Tengono il testo del visitatore separato dal comando, quindi il database non lo esegue mai. Aggiungi poi il controllo dei dati inseriti, permessi limitati sul database e aggiornamenti regolari.
Un firewall blocca la SQL injection?
Un web application firewall blocca molti schemi di attacco noti ed è un buon livello in più. Non corregge però il codice insicuro che c'è dietro, e chi attacca trova sempre nuovi modi per aggirare i filtri. Il codice stesso deve essere sicuro.
Cos'è la blind SQL injection?
È una forma dell'attacco in cui la pagina non mostra alcun dato del database. Chi attacca fa domande a cui si risponde sì o no e osserva come cambia la pagina o quanto tempo impiega a rispondere. È più lenta, ma può comunque rivelare cosa contiene il database.
Cosa devo fare se il mio sito ha subito una SQL injection?
Blocca l'attacco o metti offline la parte colpita, poi trova e correggi la query debole. Cambia password e chiavi, controlla quali dati sono stati letti o modificati e, se serve, ripristina dati puliti dai backup. A seconda della legge del paese in cui lavori, potresti dover avvisare anche i tuoi clienti.
La SQL injection è un problema solo dei siti web?
No. App per smartphone, programmi per computer e qualsiasi sistema che invia il testo dell'utente a un database SQL possono avere la stessa debolezza. Nelle app il rischio di solito sta nell'API, cioè la connessione che l'app usa per parlare con il suo server.

Hai ancora dubbi su come questo si applichi al tuo progetto?

Raccontaci cosa stai creando e ti risponderemo con parole semplici e chiare.