Che cos’è l’iniezione SQL (SQLi)?
L’iniezione SQL (SQLi) è un tipo di attacco in cui gli aggressori inseriscono istruzioni SQL dannose nel campo di input per manipolare il database.
Questo attacco prende di mira applicazioni che non gestiscono correttamente la validazione e l’input dell’utente, permettendo l’accesso non autorizzato a dati sensibili come password o dettagli delle carte di credito, ecc.
Come funziona l’iniezione SQL
Quando un’applicazione include direttamente l’input dell’utente in una query di database senza una corretta validazione, gli aggressori possono modificare il comportamento della query per inserire un’istruzione SQL dannosa.
Per esempio:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
Un aggressore potrebbe inserire:
' OR '1'='1
Risultando in:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Questo restituisce sempre vero, concedendo accesso non autorizzato.
Perché l’iniezione SQL è importante nella cybersecurity
L’iniezione SQL è la tecnica più pericolosa e antica nella cybersecurity. Questo tipo di attacco è costantemente elencato nella OWASP Top 10.
Anche piccole vulnerabilità permettono a un aggressore di:
- Accedere, modificare o eliminare dati
- Bypassare l’autenticazione
- Eseguire operazioni amministrative sul database.
- Compromettere l’intero sistema.
Tipi Comuni di SQL Injection
- SQLi Classico : Iniezione diretta tramite moduli web o parametri URL.
- SQLi Cieco : Gli attaccanti deducono informazioni sul database indirettamente (ad esempio, tramite messaggi di errore o tempo di risposta).
- SQLi Basato su UNION : Utilizza l’operatore UNION per combinare i risultati di più query.
- SQLi Basato su Errori : Si basa sui messaggi di errore del database per estrarre informazioni.
- SQLi Cieco Basato su Tempo : Sfrutta i ritardi di risposta del server per indovinare i risultati delle query.
Come Prevenire SQL Injection
1. Utilizzare Query Parametrizzate (Prepared Statements)
Assicurarsi che i comandi SQL trattino l’input dell’utente come dati, non come codice eseguibile.
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. Validazione e Sanitizzazione dell’Input
Validare tutti gli input degli utenti, permettendo solo i caratteri previsti.
3. Utilizzare Framework ORM
Framework come Prisma, Hibernate, ecc, riducono la gestione diretta di SQL.
4. Principio del Minimo Privilegio
Limitare i permessi degli utenti, concedendo solo i permessi necessari.
5. Test di Sicurezza Regolari
Usa strumenti di test di sicurezza delle applicazioni come SAST, DAST o IAST per rilevare precocemente i difetti di iniezione.
Esempio nel Mondo Reale
Un sito web di un negozio online ha subito una violazione in cui gli attaccanti hanno utilizzato un’iniezione SQL in un modulo di login per estrarre i dettagli delle carte di credito dal suo database.
Termini Correlati
- XSS (Cross-Site Scripting)
- DAST (Dynamic Application Security Testing)
- OWASP Top 10
- Application Security Testing