Diventa Autore per CoreTech | Scopri di più
18/11/21 CoreTech Blog
SQL Injection (SQLi) è un tipo di attacco di iniezione che consente di eseguire istruzioni SQL dannose. Queste istruzioni controllano un server di database dietro un'applicazione web. Gli aggressori possono utilizzare le vulnerabilità di SQL injection per aggirare le misure di sicurezza delle applicazioni. Possono aggirare l'autenticazione e l'autorizzazione di una pagina Web o di un'applicazione Web e recuperare il contenuto dell'intero database SQL. Possono anche utilizzare SQL Injection per aggiungere, modificare ed eliminare record nel database.
Una vulnerabilità SQL Injection può interessare qualsiasi sito Web o applicazione Web che utilizza un database SQL come MySQL, Oracle, SQL Server o altri. I criminali possono utilizzarlo per ottenere l'accesso non autorizzato ai tuoi dati sensibili: informazioni sui clienti, dati personali, segreti commerciali, proprietà intellettuale e altro. Gli attacchi SQL Injection sono una delle vulnerabilità delle applicazioni Web più antiche, diffuse e pericolose. L'organizzazione OWASP (Open Web Application Security Project) elenca le iniezioni nel documento OWASP Top 10 2017 come la minaccia numero uno alla sicurezza delle applicazioni web.
Per effettuare un attacco SQL Injection, un utente malintenzionato deve prima trovare input di utenti vulnerabili all'interno della pagina Web o dell'applicazione Web. Una pagina Web o un'applicazione Web che presenta una vulnerabilità SQL Injection utilizza tale input dell'utente direttamente in una query SQL. L'attaccante può creare contenuti di input. Tale contenuto è spesso chiamato payload dannoso ed è la parte fondamentale dell'attacco. Dopo che l'autore dell'attacco ha inviato questo contenuto, nel database vengono eseguiti comandi SQL dannosi.
SQL è un linguaggio di query progettato per gestire i dati archiviati in database relazionali. Puoi usarlo per accedere, modificare ed eliminare i dati. Molte applicazioni web e siti web archiviano tutti i dati in database SQL. In alcuni casi, puoi anche utilizzare i comandi SQL per eseguire i comandi del sistema operativo. Pertanto, un attacco SQL Injection riuscito può avere conseguenze molto gravi.
Esistono diversi tipi di attacchi SQL Injection: SQLi in banda (utilizzando errori di database o comandi UNION), SQLi cieco e SQLi fuori banda.
L'unico modo sicuro per prevenire gli attacchi SQL Injection è la convalida dell'input e le query parametrizzate, incluse le istruzioni preparate. Il codice dell'applicazione non deve mai utilizzare direttamente l'input. Lo sviluppatore deve disinfettare tutti gli input, non solo gli input dei moduli Web come i moduli di accesso. Devono rimuovere potenziali elementi di codice dannoso come le virgolette singole. È anche una buona idea disattivare la visibilità degli errori del database sui siti di produzione. Gli errori del database possono essere utilizzati con SQL Injection per ottenere informazioni sul database.
Se scopri una vulnerabilità di SQL Injection, ad esempio utilizzando una scansione Acunetix, potresti non essere in grado di risolverla immediatamente. Ad esempio, la vulnerabilità potrebbe essere nel codice open source. In questi casi, puoi utilizzare un firewall per applicazioni Web per disinfettare temporaneamente l'input.
Prevenire le vulnerabilità di SQL Injection non è facile. Le tecniche di prevenzione specifiche dipendono dal sottotipo di vulnerabilità SQLi, dal motore del database SQL e dal linguaggio di programmazione. Tuttavia, ci sono alcuni principi strategici generali che dovresti seguire per mantenere sicura la tua applicazione web.
Per mantenere sicura la tua applicazione web, tutti coloro che sono coinvolti nella creazione dell'applicazione web devono essere consapevoli dei rischi associati alle vulnerabilità CSRF. Dovresti fornire una formazione sulla sicurezza adeguata a tutti i tuoi sviluppatori, personale addetto al controllo qualità, DevOps e SysAdmins.
Considera tutto l'input dell'utente come non attendibile. Qualsiasi input dell'utente utilizzato in una query SQL introduce il rischio di un'iniezione SQL. Tratta l'input da utenti autenticati e/o interni allo stesso modo in cui tratti l'input pubblico.
Non filtrare l'input dell'utente in base alle blacklist. Un aggressore intelligente troverà quasi sempre un modo per aggirare la tua lista nera. Se possibile, verifica e filtra l'input dell'utente utilizzando solo whitelist rigorose.
Le vecchie tecnologie di sviluppo web non hanno la protezione SQLi. Utilizzare l'ultima versione dell'ambiente e del linguaggio di sviluppo e le ultime tecnologie associate a quell'ambiente/linguaggio. Ad esempio, in PHP usa PDO invece di MySQLi.
Non provare a creare una protezione SQLi da zero. La maggior parte delle moderne tecnologie di sviluppo può offrire meccanismi per proteggersi da SQLi. Usa questi meccanismi invece di provare a reinventare la ruota. Ad esempio, utilizzare query con parametri o stored procedure.
Le SQL Injection possono essere introdotte dai tuoi sviluppatori o tramite librerie/moduli/software esterni.