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 SQLi iniezione SQL attacco SQL injection iniezione di codice SQL iniezione nel database attacco di tipo injection
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:
- 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".
- 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.
- 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".
- 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 rischiosa | Abitudine più sicura |
|---|---|
| Unire il testo del visitatore direttamente nella query | Usare prepared statement per ogni query |
| Un solo account del database con tutti i permessi per tutto | Un account limitato per ogni parte del sito |
| Mostrare gli errori completi del database sulla pagina | Un messaggio breve per i visitatori, i dettagli nei log privati |
| Plugin lasciati senza aggiornamenti per mesi | Aggiornamenti regolari e un elenco chiaro di ciò che è installato |
| Testare solo che le funzioni vadano | Testare 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?
Anche un sito piccolo può subire una SQL injection?
Come faccio a sapere se il mio sito è vulnerabile alla SQL injection?
Qual è il modo migliore per prevenire la SQL injection?
Un firewall blocca la SQL injection?
Cos'è la blind SQL injection?
Cosa devo fare se il mio sito ha subito una SQL injection?
La SQL injection è un problema solo dei siti web?
Hai ancora dubbi su come questo si applichi al tuo progetto?
Raccontaci cosa stai creando e ti risponderemo con parole semplici e chiare.