eWPT · SQL Injection
SQLi Fundamentals
Difficoltà: Intermediate Time to Master: 3h Prerequisiti: 02-Scanning-Enumeration/03-Web-Enumeration.md Lab: PortSwigger Academy: SQL injection
Obiettivo
Una query SQL costruita concatenando l’input dell’utente senza controlli è come una frase a cui manca la punteggiatura giusta: basta chiudere una stringa nel punto sbagliato (o giusto, dal tuo punto di vista) e il database esegue tutt’altro rispetto a quello che lo sviluppatore aveva in mente. Qui capisci il meccanismo di base — il perché, non solo il come — perché è la fondamenta su cui poggiano tutte le varianti (error/union/blind) che vedi nei file successivi.
Concetti chiave
Perché funziona
-- Query originale nell'applicazione:
SELECT * FROM users WHERE username='INPUT' AND password='INPUT2'
-- Se INPUT = admin' --
SELECT * FROM users WHERE username='admin' --' AND password='INPUT2'
-- il -- commenta il resto: login come admin senza sapere la password
Punti di injection comuni
| Punto | Esempio |
|---|---|
| Parametro GET | ?id=1 |
| Campo form/POST | login, ricerca |
| Header HTTP | User-Agent, X-Forwarded-For (loggati in DB) |
| Cookie | valori riflessi in query |
Identificare il DB engine dal comportamento
| Test | MySQL | MSSQL | PostgreSQL | Oracle |
|---|---|---|---|---|
| commento | -- o # |
-- |
-- |
-- |
| concatenazione | CONCAT(a,b) |
a + b |
a \|\| b |
a \|\| b |
| stringa versione | SELECT version() |
SELECT @@version |
SELECT version() |
SELECT banner FROM v$version |
| sleep | SLEEP(5) |
WAITFOR DELAY '0:0:5' |
pg_sleep(5) |
DBMS_LOCK.SLEEP(5) |
Strumenti
| Tool | Comando base | Output | Note |
|---|---|---|---|
| Burp Repeater | modifica parametro a mano | risposta diretta | primo strumento da usare, sempre |
| sqlmap | sqlmap -u URL --batch |
conferma automatica | vedi 07-SQLMap-Automation.md |
Payload / Esempi
Esempio 1: test di base per confermare SQLi
' OR 1=1 --
' OR '1'='1
" OR 1=1 --
1 OR 1=1
1' AND '1'='1
1' AND '1'='2
Spiegazione: se '1'='1 restituisce risultati diversi da '1'='2', l’input influenza la query, a conferma dell’injection prima ancora di sapere il tipo esatto (error/union/blind).
Esempio 2: identificare il numero di colonne (necessario per UNION, vedi file dedicato)
' ORDER BY 1 --
' ORDER BY 2 --
' ORDER BY 3 -- -- errore qui = la tabella ha 2 colonne
Evasion / Bypass Techniques
Vedi 06-Encoding-Bypasses.md per la lista completa: qui solo la logica di base, se il carattere ' viene filtrato, prova a chiudere il contesto con ", backtick, o senza quote (contesto numerico).
Lab Hands-On
Lab 1: PortSwigger: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
Obiettivo: bypassare un filtro categoria per vedere prodotti nascosti Difficulty: Facile Time: 20 min
Walkthrough breve:
- Identifica il parametro vulnerabile (es.
?category=Gifts) - Testa
' OR 1=1-- - Osserva risultati aggiuntivi restituiti
Common Mistakes
- Testare solo l’apice singolo
'-> alcune query usano doppi apici o nessuna quote (contesto numerico) - Non commentare correttamente il resto della query -> ricorda lo spazio dopo
--in molti DB engine - Ignorare i messaggi di errore -> spesso rivelano il DB engine esatto, guida tutte le tecniche successive
Link Utili
Connessioni
- Prerequisito: 02-Scanning-Enumeration/03-Web-Enumeration.md
- Prossimo Step: 02-Error-Based-SQLi.md
- Combinazione con: 06-Authentication-Authorization/05-Credential-Attacks.md
Checklist di padronanza
- So confermare una SQLi con test base
- So identificare il DB engine dal comportamento
- So contare le colonne con ORDER BY
- Capisco perché il commento SQL “spezza” la query originale