mercoledì 6 aprile 2016

Come proteggersi dall'sql injection

Tags

Chi smanetta con i database sarà sicuramente a conoscenza della problematica dell'sql injection.
Un tempo questa era decisamente una problematica molto diffusa nel web, oggi per fortuna sono pochi i siti web che ne soffrono.
E' comunque importante sapere come proteggersi dall'sql injection.

Che cos'è l'sql injection?
Per sql injection si intende l'inserimento di codice sql malevolo all'interno delle chiamate fatte al database tramite una pagina web.

Come funziona l'sql injection?
L'Hacker di turno (anche se hacker è un parolone in questo caso) riesce a fare danni su un sito internet tramite l'sql injection, immettendo del codice direttamente nell'url della pagina web, o dentro un campo di un form presente sul sito da attaccare.
Scrivendo infatti una determinata sintassi, se il sito non è fatto bene, è possibile leggere,modificare,cancellare un'intera tabella o anche tutto il database.
Stiamo ovviamente parlando di quei siti che si appoggiano a database sql.
In sql infatti, all'interno delle query è possibile passare delle variabili, e per far ciò spesso si usa, come sintassi, l'apostrofo o le virgolette.
Quindi, se le variabili che si passano alle query sql non vengono controllate, un malintenzionato potrebbe inserire degli apici per poter manipolare la query in modo da passare ulteriori comandi al nostro database.

Esempio pratico di sql injection
Prendiamo ad esempio un sito che consente di fare la login tramite form per poter accedere all'area riservata.
Verrà quindi chiesto all'utente di inserire username e password in una form che usa il metodo POST.
Uno smanettone potrebbe innanzitutto cambiare il metodo da POST a GET, e vedere i dati passati direttamente via url.
Poi potrebbe passare alla nostra pagina un apice seguito da una sintassi sql per bypassare la login.
Per esempio, la stringa potrebbe esserre una cosa del genere:
...pagina.php?username=' and 1=1 --'
Ora l'esempio sarà sicuramente sbagliato perchè non ho sottomano nessun sito dove poter provare (non so se sarebbe illegale fare una prova del genere), comunque scrivendo (più o meno) così ho aggiunto alla query (mettendo l'apice nella stringa da passare alla pagina) una nuova condizione sempre vera OR 1=1 e poi con il comando -- ho detto di ignorare tutto ciò che c'è scritto dopo nella query.
Così facendo ad esempio, se la query usata nel sito è una cosa del genere
"SELECT id,nome,cognome FROM utenti WHERE username='.$username.' AND password='.$password.'"
dovrebbe farmi fare la login al sito con il primo utente che trova, senza che io ne conosca username o password.

Come capire se il proprio sito soffre di sql injection?
Per capire se il proprio sito soffre di sql injection, basta mettere nell'url (o nei form) delle pagine che fanno una chiamata al database, un apice (') o le virgolette (").
Se il sito risponde con un errore di database... ahia, allora vuol dire che la variabile passata via url o form non è parsata (pulita), quindi potenzialmente il sito è a rischio.
Poi non è detto che uno riesca comunque a far danni, dipende da come sono fatte le query... ma sempre meglio non rischiare!

Come proteggersi dall'sql injection
Veniamo finalmente al dunque.
Per proteggersi dall'sql injection si può agire in diversi modi:

  1. Parsare tutte le variabili passate al database: raddoppiare gli apici o togliere i caratteri che possono consentire al malintenzionato di manipolare il database.
    La pulizia delle variabili può variare da db a db, e anche dal linguaggio utilizzato.
    Ad esempio in asp si potrebbero raddoppiare gli apici della variabile username con una replace:
    username=replace(username,"'","''")
    o
    username=replace(username,"'","\'")
    Dipende dal db, per alcuni si inibisce raddoppiando gli apici, per altri mettendoci prima uno slash.
    In php ad esempio c'è la funzione addslashes: http://php.net/manual/en/function.addslashes.php
  2. Controllare che le variabili previste via form arrivino solo via form: per rendere più difficile la vita al malintenzionato, le variabili che arrivano via form, controllate che arrivino con il metodo POST. Ad esempio in php:
    $username=$_POST["username"];
  3. Controllate che le variabili arrivino dallo stesso dominio del sito: giusto per complicare ulteriormente le cose al pirata di turno, bloccate eventuali script creati sulla macchina del malintenzionato, controllando che l'url di provenienza della chiamata corrisponda al dominio del vostro sito. 
Un malintenzionato bravo può riuscire a bypassare il punto 2 e 3, ma sul punto 1 non si scappa :-)

Proteggere il proprio sito dall'sql sql injection è molto importante sia per se stessi, che per gli utenti iscritti al vostro sito web.
Se ad esempio il nostro sito è bucato, potremmo arrecare danno anche ai nostri utenti, facendo magari in modo che un malintenzionato scopra la loro email, la loro password (se salvata in chiaro nel database), o si impossessi della loro utenza.
Ad esempio se una persona non usa una password diversa da quella della mail di registrazione, il cattivo di turno potrebbe addirittura entrare in possesso della casella email e di tutti i preziosi dati dentro contenuti.

Non parliamo poi del fatto che un buon sql injection potrebbe addirittura farvi perdere l'intero database!

Questo discorso vale anche al contrario, io ad esempio sono capitato su diversi siti che soffrivano di sql injection, ed ho rinunciato a registrarmici (dopo aver verificato con mano i loro bachi di sicurezza ;)) per evitare che qualche furbone beccasse i miei dati.

Piaciuto l'articolo? Lascia un commento!

EmoticonEmoticon