Tecniche di Bypass del Login e SQL Injection Basata su Booleani
--- Nei moduli di login collegati a un database utenti, la verifica avviene tramite una query SQL del tipo:
Tecniche di Bypass del Login e SQL Injection Basata su Booleani
Bypassare il Login con SQL Injection
Nei moduli di login collegati a un database utenti, la verifica avviene tramite una query SQL del tipo:
SELECT FROM users WHERE username='inserito_username' AND password='inserita_password';Se il database trova una corrispondenza, restituisce un risultato e consente l’accesso. Se no, l’accesso viene negato.
Come funziona il bypass? Se inseriamo nel campo password questo payload:
' OR 1=1;--la query diventa:
SELECT FROM users WHERE username='' AND password='' OR 1=1;Poiché 1=1 è sempre vero, la condizione complessiva risulta sempre vera e l'accesso viene concesso senza conoscere credenziali valide.
SQL Injection Boolean Based: Cos’è e Come Sfruttarla
La SQL Injection basata su booleani si basa sul fatto che le risposte del server possono essere solo due: vero/falso, sì/no. Anche se sembrano limitate, queste risposte permettono di interrogare il database in modo molto preciso, fino a ricostruirne struttura e dati.
Esempio pratico di enumerazione
Consideriamo un endpoint che verifica se un username esiste:
https://website.thm/checkuser?username=adminRisponde con {"taken": true} se l’utente esiste, {"taken": false} se no.
La query eseguita è:
SELECT * FROM users WHERE username='%username%' LIMIT 1;Usando tecniche di SQL Injection, si può modificare la query per far sì che risponda true a nostre richieste specifiche, scoprendo informazioni sul database.
Passi per l’enumerazione:
1. Individuare il numero di colonne
Provando payload con UNION SELECT, es.:
admin123' UNION SELECT 1;--
Se errore, aumentiamo il numero di colonne finché la query è valida:
vbnet
CopiaModifica
admin123' UNION SELECT 1,2,3;--
2. Scoprire il nome del database
Usando la funzione database() e il filtro LIKE, ad esempio:
bash
CopiaModifica
admin123' UNION SELECT 1,2,3 WHERE database() LIKE 's%';--
Cambiando la lettera iniziale si può ricostruire il nome completo (sqli_three).
3. Enumerare le tabelle
Utilizzando information_schema.tables e filtrando per table_schema e table_name, si scoprono le tabelle presenti.
4. Trovare le colonne delle tabelle
Similmente, interrogando information_schema.columns, si identificano i nomi delle colonne.
5. Recuperare dati sensibili
Una volta note tabelle e colonne, si possono estrarre dati come username e password.
Nota sull’uso di SLEEP() per verifiche
Per capire se una query è corretta, si può usare la funzione SQL SLEEP(), che fa ritardare la risposta del server. Se, ad esempio, inseriamo:
sql
CopiaModifica
admin123' UNION SELECT SLEEP(5),2,3 WHERE database() LIKE 'u%';--
Il server risponderà dopo 5 secondi solo se la query è valida e la condizione è vera.