SQLi-SQL Injection

Che cos’è?

Il termine SQLi è l’abbreviazione di SQL Injection e denota una vulnerabilità che permette a terzi di alterare le basi dati utilizzate da un sito web.

Perché è rilevante?

Le basi dati dei siti web possono contenere informazioni molto sensibili, come ad esempio numeri di carta di credito, password, indirizzi e simili¹.
SQL è un insieme di comandi (un linguaggio) per la gestione delle basi di dati ivi compresi cancellazione, modifica ed interrogazione.
La possibilità di modificare questi comandi permette a terzi il controllo sulla base dati del sito, solitamente la finalità è il furto delle credenziali di accesso ma scenari più elaborati sono possibli.
Se un sito che frequentiamo regolarmente (e quindi in cui abbiamo registrato un nome utente ed una password) è soggetto a SQLi è molto probabile (se non certo) che il nostro nome utente e la nostra password vengano rubate.

Come mi difendo?

Per l’utilizzatore di un sito web con una vulnerabilità SQLi essa significa quasi sempre un furto di credenziali con conseguente furto di identità (sebbene bersagli più prestigiosi possano andare in contro a strategie di attacco meno evidenti).
Non è tradizionalmente ritenuto compito degli utilizzatori accertarsi che non esistano queste vulnerabilità prima di usare un sito web, l’approccio è invece di tipo difensivo: utilizzare password diverse per ogni sito, in modo da limitare i danni in caso di furto di credenziali.
Dato la consistente quantià di siti web utilizzati quotidianamente un approccio più pratico è quello di dividere i siti web in base alla sensibilità delle informazioni inserite e alle funzionalità del sito. Ad esempio si potrebbe avere una password diversa per l’home-banking, una per i social e per l’e-mail, una per il lavoro² ed una per tutti i siti spazzatura che siamo costretti ad usare³.

Cos’è tecnicamente?

Il mancato utilizzo di escape nei comandi SQL generati dinamicamente quando la sintassi del comando è controllabile direttamente o indirettamente dall’esterno.
Cercare dentro un sito tramite una barra di ricerca richiede interrogare la base dati con un comando che contiene le parole cercate, un mancato utilizzo di escape permette di cambiare il comando SQL usato dal sito web tramite ricerche con parole particolari.

Come si rimedia?

Il CERT-AGID si augura che tu stia leggendo questa sezione solo per curiosità.
Utilizzare sempre e soltando prepared statement (PS) per eseguire comandi SQL.
Nei rari casi in cui i PS non siano sufficientemente espressivi (per esempio per i comandi con nomi di oggetti dinamici) utilizzare sempre e soltando valori in una whitelist.


¹ I siti web che trattano dati molto sensibili sono comunque chiamati a rispettare politiche di prevenzione multi strato che limitano i danni in caso di furto.
² Questo dipende dai servizi usati a lavoro ed in ogni caso la politica di sicurezza non deve essere inferiore a quella stabilita dal contesto lavorativo.

³ La classificazione dei siti e le relative implicazioni sono questioni non banali, il CERT-AGID consiglia sempre di usare una password in più che una in meno.