Oggi finalmente, dopo la mia recensione di Kali Linux, sono qui per parlarvi, come promesso, di un’argomento piuttosto interessante e secondo me fondamentale per la sicurezza online, per quanto riguarda la parte di sviluppo e quindi progettazione di siti o piattaforme software.
L’argomento di oggi, come ci dice anche il titolo, è l’sql injection.
Questo argomento è piuttosto lungo da trattare, di conseguenza anche l’articolo non è breve. Quindi armatevi di un po’ di pazienza e cerchiamo di arrivarci in fondo. Sia tu come lettore, che io come blogger, che sta scrivendo, anzi in questo caso dato che lo stai leggendo, che ho scritto questo articolo.
Per affrontare questo argomento, è meglio scomporlo in piccoli concetti o, se lo preferite, in tanti micro argomenti, che collegati insieme, formano il concetto finale che voglio passare.
Che cos’è L’SQL Injection?
Per capire questo concetto, bisogna tradurre il termine dall’inglese all’italiano. Injection in inglese vuol dire iniezione. Quindi questo termine significa proprio iniezione di codice SQL. Come abbiamo visto fin dalla mia prima lezione di MySQL, che ti consiglio di andare a leggere prima di proseguire con la lettura di questo articolo, per comprendere bene il tutto e quindi di non perdere determinati argomenti, l’SQL è un linguaggio utilizzato per la realizzazione e la gestione di un database. Ogni servizio online è formato essenzialmente da due parti. La prima, caricata in un server Apache, consente di fornire agli utenti l’interfaccia grafica e di effettuare una prima elaborazione dei dati. Inoltre questa sezione gestisce gli accessi e fornisce agli utenti tutte le funzionalità previste dall’applicazione in questione.
La seconda parte, che forma la piattaforma online, sarebbe il database, solitamente un database MySQL che, nella maggior parte dei casi, funziona tramite MySQL o il suo fork MariaDB.
Questa parte serve per la gestione e la memorizzazione dei dati memorizzati, che possono essere i dati di acceso, i dati di pagamento e così via.
L’SQL Injection comprende tutta una serie di procedure che l’hacker mette in atto, per cercare di inserire e quindi far eseguire, all’interno del database, alcune istruzioni, che gli consentiranno di danneggiare lo stesso, rimuovendo o danneggiando quindi i dati contenuti al suo interno oppure per cercare di rubarli.
Per effettuare questa tecnica, l’hacker deve intervenire sulla prima parte dell’applicazione, ovvero quella inserita nel web server Apache. Vedremo in seguito come fare.
Gestione dei dati con il linguaggio php
Per capire come facciano gli hacker a rubare o danneggiare i dati, bisogna capire come vengono gestiti questi ultimi dal php.
Intanto c’è da dire che l’applicazione che gira sul web server è formata da un’interfaccia grafica, sviluppata con html, css e una parte di elaborazione dati, sviluppata in php.
Per l’elaborazione dei dati viene usato il php e non altri linguaggi come il JavaScript, in quanto il primo funziona sul server e quindi non è possibile monitorare in modo completo il suo funzionamento e di conseguenza è anche più difficile trovare il modo di danneggiare la piattaforma. Il JavaScript, invece, viene eseguito nel computer dell’utente, che può in qualsiasi momento studiarsi il codice e vedere come funziona la gestione dei dati. Questo metodo di sviluppo è alquanto in sicuro perché è come lasciare la porta di casa aperta. Chiunque può entrare per fare danni o per rubare o perché no, per fare entrambe le cose.
Il php riceve i dati da elaborare in due modi distinti. Il primo è il metodo GET, che permette di ricevere dati dalla URL della pagina.
Avete mai notato che ci sono molti siti che hanno una struttura della url simile a questa?
http://www.sito.com?informazione=qualcosa
Bene. In questo caso ho trasmesso ad una pagina una qualche informazione, sotto il nome di informazione, che dovrà poi successivamente essere elaborata per effettuare una determinata operazione.
Il secondo modo è con il metodo POST, che consente di ricevere dati tramite form. Avete mai visto in determinate pagine dei form in cui vi vengono richieste determinate informazioni?
Bene. Queste informazioni verranno successivamente inviate e poi elaborate.
Durante l’invio i dati possono essere vulnerabili, se il server non supporta una connessione criptata con il protocollo SSL, in quanto i dati potrebbero venire intercettati, rubati o modificati.
Una volta che questi dati vengono ricevuti dal web server inizia la fase di verifica, che vedremo tra poco, che comprende tutta una serie di test specifici per ogni dato ricevuto. La procedura di controllo cambia a seconda del programmatore e delle scelte sulla sicurezza che ha adottato per la sua applicazione.
Una volta che i dati sono stati processati con successo, vengono inviati all’interno del database, per essere memorizzati oppure per essere utilizzati per confrontarli con quelli già presenti all’interno del database.
Confronto dei dati
Come abbiamo appena detto, i dati inseriti dall’utente possono venire confrontati con quelli già presenti nel database. Questa pratica viene solitamente utilizzata per approvare l’identità di un utente durante il processo di login.
Una volta che questi dati sono stati confrontati con successo, la risposta dovuta al confronto viene ritornata al server apache e quindi elaborata dallo script php.
A seconda della risposta che il database invia, l’utente in questo caso si potrà loggare oppure no. Per evitare problemi e quindi evitare che il sistema di login venga compromesso e che quindi un hacker possa introdursi all’interno di un account senza bisogno della password, avendo a che fare, quindi, con un vero e proprio attacco alla piattaforma, bisognerebbe fare in modo, come vedremo anche in seguito, che le informazioni inviate dall’utente non siano subito processate dal database, ma che prima vengano prima controllati con degli opportuni controlli.
Come vengono controllati i dati con il php?
I dati vengono controllati all’interno di php. Innanzi tutto con il php è possibile verificare se l’utente ha veramente inserito dei dati. Successivamente si può effettuare alcuni controlli e applicare qualche misura di sicurezza necessaria per evitare i problemi più comuni.
Vi starete chiedendo quali potrebbero essere i problemi più comuni.
Beh intanto un hacker può provare ad effettuare una cosa molto semplice, ovvero cercare di far eseguire del codice php o html in modo ovviamente abusivo, perché non penso che l’admin della piattaforma sia contento che un’utente inserisca del codice php all’interno dei form, che poi verrà eseguito, e che potenzialmente possa causare dei danni seri.
Per questo motivo, ogni volta che la piattaforma riceve un dato, solitamente lo sviluppatore, fa passare il dato alla funzione strip_tags, che non fa altro che rimuovere tracce di tag html o php che possano compromettere, come detto prima, l’intero sistema.
Questa funzione viene applicata sia ai dati che arrivano come metodo POST, che quelli con metodo GET. In entrambi i casi si potrebbero infatti far eseguire codice dannoso, che possa poi far eseguire delle query, ovvero delle richieste, al database, come ad esempio cancella tutto o copia questi dati e così via.
Ovviamente questo non è minimamente sufficiente a fermare un hacker, ma comunque diciamo che gli mette un po’ di difficoltà.
Vediamo un esempio di quello che abbiamo appena detto.
In questo caso, all’interno del form, ho inserito semplicemente la parola ciao. Proviamo ora a scrivere la stessa parola, ma apportando il tag <b> per formattarla in grassetto.
<b> ciao </b>
Il codice per gestire il metodo post che ho usato ora è questo:
Come possiamo notare la parola è stata formattata in grassetto. Ora proviamo a passare il dato tramite la funzione strip_tags
Quindi vediamo se cercando di formattare il testo in grassetto, si formatta ancora oppure no
E infatti ora la scritta ciao non è più formattata.
Il codice usato, per controllare i dati tramite la funzione strip_tags è questo:
Dato che ora abbiamo ampiamente visto il funzionamento della funzione strip_tags vediamo altri problemi ancora più gravi, che riguardano il database, in quanto la guida è strutturata in modo da trattare l’sql injection.
Una procedura molto importante, da attuare nel caso in cui ci siano delle condizioni in cui molto probabilmente l’intervento della funzione strip_tags è inutile, è utilizzare tutta una serie di controlli, formati da diverse funzioni prestabilite di Php, che consentono di verificare che i dati inseriti all’interno di una stringa non siano dannosi.
Notiamo che la prima funzione, strpos, non fa altro che verificare se all’interno di una stringa sia presente una frase, un carattere o qualsiasi altra cosa che potrebbe causare potenzialmente dei problemi.
La seconda funzione, che si attiva soltanto se la funzione precedente ha rilevato delle minacce, è str_replace, che ci consente di sostituire le parole o i simboli pericolosi con altri simboli o molto semplicemente con una stringa vuota, in modo tale da fare in modo che quel determinato carattere non sia più presente nella maniera più totale.
Queste due funzioni sono nate per il controllo di stringe di testo, ma possono essere impiegate anche per favorire maggior sicurezza all’interno della propria piattaforma.
Questo sistema può essere adottato sia per il metodo post, che per il metodo get.
Ora vedremo come sia possibile comunque eludere la funzione che abbiamo visto fino ad ora, facendo eseguire del codice sql che immettiamo all’interno del metodo get, quindi nella url della pagina
Per fare questo ho creato una tabella all’interno di un database, chiamandola users. All’interno ho memorizzato un utente.
Una volta che ho realizzato il mio database provvederò a riempirlo con diversi dati di diversi utenti fittizi, per effettuare tutta una serie di prove.
Bene ora che ho riempito il database con diversi dati proviamo a fare diverse prove.
In questo screen possiamo notare che all’interno della url della pagina in questione, è presente un id=numero. Bene. Ora proviamo a modificare il numero.
Modificando l’id mi è stato possibile loggarmi come se fossi un’altro utente, Lo so questi sono degli esempi molto stupidi e che molto probabilmente in siti ben fatti non troverete mai problemi di questo tipo. Ho deciso comunque di mostrarvi lo stesso il problema per farvi vedere come sia facile manipolare i dati attraverso il metodo GET o anche attraverso i form, con il metodo POST.
Invio dei dati al server
Prima di proseguire volevo aprire questa piccola parentesi sulla comunicazione client-server.
Durante la comunicazione dei dati, i dati stessi sono vulnerabili e possono essere intercettati da hacker per poi essere rubati o modificati, per causare dei danni. Ovviamente se un server supporta la connessione criptata con il protocollo SSL è molto meglio ed è una cosa che consiglio di abilitare nella propria piattaforma, per evitare problemi di sicurezza, anche gravi.
Il protocollo SSL cripta la connessione, facendo si che durante la comunicazione dei dati tra client e server, sia impossibile risalire alla conversazione e leggere i vari pacchetti inviati e ricevuti.
L’utilizzo di protocollo SSL è consigliato per evitare ancor più problemi di SQL Injection
L’importanza di aggiornare il database SQL
In una piattaforma il webmaster deve assolutamente tenere aggiornato il proprio server Apache e database MySQL, alle ultime versioni. Se non si effettuano aggiornamenti regolari, cosa che non tutti fanno, si rischia di incorrere a problemi di sicurezza abbastanza gravi.
Ad esempio, fino a quasi 2 anni fa, si poteva, tramite i form in php, interagire con le query SQL, facendo in modo che la query si interrompesse, con l’ausilio di un comando non valido come l’apostrofo e di iniziare una nuova query. Se il webmaster non applicava dei controlli manuali, via php, un malintenzionato poteva inserire come inizio stringa il carattere di interruzione ed eseguire una query come ‘ ; drop table users– provocando la cancellazione totale della tabella utenti e ovviamente di tutto il suo contenuto.
Certo l’hacker doveva andare per tentativi per trovare il nome della tabella da cancellare, ma una volta rimosso tutto la piattaforma era inutilizzabile a meno che il webmaster non recuperasse tutti i dati.
Ovvio che al posto di questa query, uno poteva fare il listing di tutti i dati e farseli stampare a video o molto altro ancora.
Poi questo problema è stato risolto con un’aggiornamento software. Ora il programmatore dell’applicazione o sito web non dovrà più preoccuparsi di implementare dei controlli sulla sicurezza per evitare questo problema. Il server MySQL li effettua in modo autonomo. Meglio così.
Bene. Una volta che abbiamo visto tutti questi piccoli dettagli, direi che possiamo andare avanti.
La scorsa volta, all’interno della mia recensione di Kali Linux, avevo mostrato un tool chiamato SQLMap, che consente al programmatore dell’applicazione di visualizzare eventuali anomalie o comunque problemi sulla sicurezza e quindi risolverli.
Ovviamente questo tool può essere usato anche da malintenzionati intenti a voler hackerare la vostra piattaforma. Questo tool permette di testare la sicurezza del sito e fornisce in modo automatico tutte le varie problematiche, che poi possono essere usate come punto debole per bucare la sicurezza del sistema.
Nel caso della pagina che ho realizzato per scrivere questo articolo, ho effettuato la scansione ed ha elencato tutti i problemi, con i dovuti dettagli tecnici, che io potrei usare per effettuare un attacco.
È per questo motivo che si sconsiglia sempre di non prestare attenzione a problemi, anche minimi. E’ un attimo che l’intera piattaforma venga compromessa, insieme ai dati di tutti gli utenti, anche in modo irrimediabile.
SQLmap può effettuare anche dei test mirati, per esempio verificando la sicurezza dei dati inseriti all’interno dei form e quindi come avviene il loro controllo e la loro memorizzazione.
Ad esempio, impostando come target –data=DATA , quindi digitando
sqlmap -u http://sharekfile.falco96.com/test/index.php?n=1 –data=DATA
Dove ovviamente la url che ho inserito la dovrete sostituire con la url del sito o dei siti che volete controllare.
Questa procedura ha fatto si che mi venissero elencate tutte le problematiche riguardanti la sicurezza della trasmissione dei dati mediante il metodo POST nella mia pagina web.
Con i dati ottenuti dal controllo, potrei andare ad effettuare un attacco mirato e quindi prendere il pieno controllo della piattaforma.
Eh si avete letto bene. Prendere il pieno controllo. Questo perché non è la prima volta che un hacker riesca tramite diversi tentativi e diversi test, a prendere il controllo dell’account amministratore. Praticamente rubare l’account dell’amministratore.
Ok fino ad ora abbiamo visto moltissime cose, ma il tutto forse non rendono bene un quadro completo di tutto il problema.
Come abbiamo visto all’inizio, una qualsiasi piattaforma è in grado di memorizzare dati all’interno di un database. Questi dati sono fondamentali per il corretto funzionamento della piattaforma stessa e sono oltremodo fondamentali per garantire un servizio. È ovvio che ogni piattaforma, per poter erogare un servizio, necessita di informazioni. Informazioni dell’utente, nel caso in cui la piattaforma richieda una qualche forma di login, informazioni sui file caricati, sui testi caricati, sui post e molto altro ancora.
Per esempio Google memorizza all’interno dei propri database l’intera vita personale di ogni singolo utente che utilizza i suoi servizi. Basta calcolare che memorizza la posizione in modo costante, i numeri di telefono della rubrica, le foto personali, i video e moltissimo altro ancora.
Se venisse effettuato un attacco serio a dei database che contengono tutta questa mole di informazioni, non solo la piattaforma e ovviamente i suoi gestori ci rimettono, con magari un danno permanente e irreparabile al sistema, ma anche ogni singolo cliente riceve un danno, in quanto perde tutte le informazioni che aveva memorizzato in questi servizi e inoltre, nei casi più gravi, non sa dove siano le informazioni, se queste ultime sono state rubate.
Ovviamente se una tale mole di informazioni dovesse essere rubata, il danno sarebbe veramente incalcolabile.
Bene. Penso che tu abbia veramente capito ora di che cosa si tratta. Questo è veramente un problema molto serio. E’ per questo che i webmaster hanno una responsabilità molto alta, quando decidono di aprire un determinato servizio.
Nessuna azienda o piattaforma è da ritenersi inattaccabile. Qualsiasi sistema è attaccabile in qualche modo e sicuramente, tramite l’sql injection, qualsiasi sistema è ancora più vulnerabile.
Prevenire questi problemi
Dopo aver trattato a lungo di questo argomento e di tutti i problemi ad esso correlati, direi che è giunto il momento di vedere tutti i sistemi che ci sono e che si possono applicare, per prevenire situazioni alquanto spiacevoli.
Innanzi tutto, come penso tu abbia avuto modo di capire nel corso di questo articolo, lo sviluppatore dell’applicazione web deve prestare molta attenzione ai dati ricevuti come input.
Questo vuol dire che i dati non devono essere collegati direttamente ad una query, ma prima processati e controllati, per verificarne la loro autenticità e per accertarsi che le informazioni contenute nella url o ricevute tramite form, non siano in realtà delle istruzioni che verranno poi eseguite dal database, compiendo quindi azioni alquanto spiacevoli.
Nei controlli si dovrebbe sempre verificare se ci sono comandi che potrebbero alterare la query al database o se ci siano dei comandi che possano in un qualche modo richiamare delle funzioni che riescono ad interagire con il server web o con il database.
Sono tutti controlli piuttosto complicati, che devono essere effettuati su ogni form o ogni dato ricevuto tramite la URL della pagina web. E’ un’operazione molto lunga e complessa, infatti per sviluppare un’applicazione web ci vuole molto tempo, ma il risultato finale è veramente buono.
Per quanto riguarda gli utenti che utilizzano i servizi, utilizzate solo i servizi chiari, che spieghino tutto per bene nella documentazione, che hanno uno sviluppo costante e che presentano, in modo provato, caratteristiche che rendono l’intera piattaforma molto sicura e quasi impenetrabile da minacce di svariato tipo.
Evitate quindi di affidare i vostri dati a persone che palesemente sono incompetenti o che hanno solo intenzioni di truffarvi. Ma sui truffatori o sulle persone che non hanno molta conoscenza di queste cose ne ho già parlato in più articoli dedicati, che ti consiglio di andare a leggere nel mio blog.
Bene Il mio articolo finisce qui.
Spero che ti sei interessato sull’argomento e che soprattutto possa aver imparato un argomento così importante come l’sql injection.
Con questo è tutto. Vi aspeto al mio prossimo articolo!