SQL injection: da UNION al blind time-based
La causa è sempre la stessa: dati dell'utente trattati come codice. "SELECT * FROM users WHERE id='".$id."'" con $id = 1' OR '1'='1 cambia la condizione.
UNION: leggere altre tabelle
Se la query restituisce output, UNION SELECT aggancia una seconda select. Serve lo stesso numero di colonne e tipi compatibili:
' UNION SELECT username, password, NULL FROM users -- -Trovi il numero di colonne con ORDER BY n finché non erra.
Blind: quando non vedi nulla
Se l'output non c'è ma la risposta cambia (pagina diversa) è booleano: ' AND SUBSTRING(password,1,1)='a. Se nemmeno quello, il time-based misura il ritardo:
' AND IF(SUBSTRING(user(),1,1)='r', SLEEP(5), 0) -- -Difesa
Query parametrizzate (prepared statement) sempre: i dati non toccano mai il parser SQL. Le whitelist per identificatori (nomi colonna/tabella) che non possono essere parametrizzati. Mai fidarsi dell'escaping manuale.