Glossario · Sicurezza
SQL injection
Detto anche: SQLi, iniezione SQL, attacco SQL injection
Definizione
Vulnerabilità in cui l'input dell'utente viene concatenato in una query SQL, permettendo a un attaccante di cambiarne la logica per leggere, alterare o cancellare dati.
La SQL injection (SQLi) si verifica quando un’applicazione costruisce un’istruzione SQL incollando l’input dell’utente nella stringa della query. Se l’input contiene sintassi SQL, il database la esegue come parte della query. A seconda della query e dei permessi sul database, un attaccante può aggirare un login, leggere i dati di altri utenti, modificare record o, nei casi peggiori, eseguire comandi sul server. Rientra nella categoria A03 Injection dell’OWASP Top 10 2021.
Esempio
Codice Java vulnerabile:
String sql = "SELECT * FROM users WHERE email = '" + email + "'";
ResultSet rs = conn.createStatement().executeQuery(sql);
Se email vale ' OR '1'='1, la query diventa:
SELECT * FROM users WHERE email = '' OR '1'='1'
La condizione è sempre vera, quindi la query restituisce tutti gli utenti. La correzione è una query parametrizzata, in cui l’input viene inviato separatamente dal testo SQL e non può mai cambiarne la struttura:
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
ps.setString(1, email);
ResultSet rs = ps.executeQuery();
Cosa verifica un tester
Con un’autorizzazione scritta, in un ambiente di test:
- Rompi la sintassi. Inserisci un singolo apice
'in ogni campo di testo, parametro URL, header e valore JSON che potrebbe arrivare a una query. Un errore500, un messaggio di errore del database o un numero di risultati diverso indicano che l’input arriva all’SQL senza escaping. - Cambia la logica. Confronta
value' AND '1'='1convalue' AND '1'='2. Se le due risposte differiscono in un modo che il valore semplice non spiega, l’input viene interpretato. - Guarda gli input meno ovvi. Colonne di ordinamento, campi di filtro, caselle di ricerca e parametri dei report sono spesso costruiti dinamicamente, perché i nomi delle colonne non si possono passare come parametri.
- Controlla la gestione degli errori. Errori del database, nomi di tabelle o stack trace nelle risposte sono già di per sé un finding.
Strumenti come sqlmap automatizzano indagini più approfondite, ma usali solo su sistemi che hai il permesso esplicito di testare, perché possono modificare o cancellare dati.
Difese da verificare
Query parametrizzate o un ORM usato correttamente ovunque; allow-list per gli identificatori dinamici come le colonne di ordinamento; un account del database con privilegi minimi; messaggi di errore generici. La validazione dell’input aiuta, ma non sostituisce la parametrizzazione.