Vai al contenuto
SDETRole
SDETRole

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 errore 500, 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'='1 con value' 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.

Scrivi per cercare in tutto SDETRole.

Ricerca full-text con Pagefind · funziona nel tuo browser Apri la pagina di ricerca →