LulzSecurity, hacking e SQL injection

Nelle ultime settimane, con l’operazione #AntiSec lanciata da Anonymous e dal gruppo Lulzsecurity sono stati diffusi i dati contenuti in un numero incredibile di diversi database, la maggior parte appartenenti a “bersagli di alto profilo” come governi, dipartimenti di polizia (scandalose per il loro razzismo feroce le e-mail private scambiate fra i poliziotti dell’Arizona), banche, multinazionali…
Ma come hanno fatto?

Analizzeremo ora una delle tecniche più semplici e diffuse fra quelle usate durante l’operazione #AntiSec (e ampiamente usata anche altrove, ovviamente), la SQL injection.

Leggendo questo articolo non diventerete degli hacker (non è questo lo scopo), ma potrete farvi anche voi un’idea di quanto sia labile la sicurezza dei siti a cui affidiamo i nostri dati privati. Il fatto che queste cose siano ampiamente possibili deve farci indignare contro questi colossi che non hanno evidentemente abbastanza interesse alla propria sicurezza, alla nostra sicurezza.

Iniziamo da una vignetta presa da xkcd.


Traduzione:
Voce al telefono: “Buongiorno, siamo la scuola di suo figlio. Abbiamo qualche problema con i computer”
Mamma: “Oddio, ha rotto qualcosa?”
Voce al telefono: “In un certo senso… Ha davvero chiamato suo figlio Robert'); DROP TABLE Students; --?
Mamma: “Oh, sì. Lo chiamiamo piccolo Bobby Tables.”
Voce al telefono: “Beh, abbiamo perso tutti i dati sugli studenti di quest’anno. Spero sia contenta.”
Mamma: “E io spero che voi abbiate imparato a migliorare il controllo dei dati in input ai vostri database”


Cosa vuol dire tutto questo?
E cosa ha a che vedere con l’operazione #AntiSec?

Beh, la seconda domanda ha una risposta semplice: quello che ha fatto la mamma nella striscia di xkcd si basa sullo stesso principio che ha permesso a LulzSecurity e chiunque si sia unito all’operazione #AntiSec (come anche a un sacco di gente prima di loro) di avere accesso a database che avrebbero dovuto essere inviolabili.

Si tratta di una tecnica chiamata SQL injection, che colpisce i database di tipo SQL quando non vengono effettuati controlli sufficienti sui dati ricevuti in input dall’utente. Nella pratica, si tratta di inserire determinate stringhe di codice nei campi di qualche form a cui si ha accesso, ad esempio quelli di “nome utente” e “password” in maniera tale da ingannare il database facendogli eseguire dei comandi.
In realtà non sarebbe così difficile proteggersi da questi attacchi filtrando i dati inviati dall’utente, ma sembra che questa falla nella sicurezza sia sottovalutata da molte aziende.

Iniziamo dal nome di “Bobby Tables”, ovvero:

Robert'); DROP TABLE Students;--

Un nome piuttosto insolito, certamente, che è stato inserito in un database che si aspettava di ricevere un nome più normale, come ad esempio il semplice “Robert”. Tutto ciò che segue “Robert” in quella riga in realtà serve a dare una nuova istruzione al database, che a causa dell’apostrofo e della chiusura di parentesi non considera quanto segue come “parte del nome”, ma come un’istruzione a se stante.

Immaginiamo ad esempio che per inserire nel programma il nome di uno studente si passi attraverso una variabile $firstName, con un codice simile al seguente:

INSERT INTO 'Students' ('first_name') VALUES ('$firstName');

Ora, se non si fa nessun controllo su cosa inserisce l’utente nella variabile $firstName possiamo avere, come in questo caso,

$firstName=Robert'); DROP TABLE Students;--

Da cui il codice viene modificato nella maniera seguente:

INSERT INTO 'Students' ('first_name') VALUES ('Robert'); DROP TABLE Students;--');

Abbiamo insomma inserito un nuovo comando “DROP TABLE Students”… Formattando il tutto un po’ meglio:

INSERT INTO 'Students' ('first_name') VALUES ('Robert');
DROP TABLE Students; --');

Il carattere ‘ delimita le “stringhe” ovvero le parti di testo che vanno interpretate come testo e non come comandi. Per cui il ' dopo Robert “chiude” la stringa: Robert è la stringa, quello che segue è da interpretare come codice. ); chiude l’istruzione in corso.
In pratica, la prima riga inserisce Robert come nome nel database, mentre la seconda cancella tutto il database “Students”, facendo perdere i dati non solo su di lui, ma su tutti gli altri studenti presenti nel database.
Il “--” alla fine commenta il resto della linea.

Questo “attacco” è già abbastanza fastidioso, soprattutto se non si è fatto un backup del database di recente (cosa che ci ricorda ancora una volta che fare backup è BENE).
Però non si è limitati a dare la sola istruzione DROP TABLE: si possono dare altre istruzioni.

Spero di essere stata abbastanza chiara… E di non avere fatto errori nel codice di esempio ^_^
Se avete domande o correzioni da fare, non esitate!

Share/Bookmark
  • giusalex1

    illuminante.grazie.

  • Andrea Angelotti

    Appena sarà disponibile metti il tastino di Share su Google+ che tutte queste cose le condivido più che volentieri!!! 😉

    Gran bel articolo sulla SQL Injection, spiegato davvero bene in poche parole!

    • http://www.newfractals.net Elena Itzcovich

      Per ora ho messo il +1, che mancava… Vediamo quando riesco a mettere il vero e proprio share.
      Sono felice ti sia piaciuto l’articolo, temevo tantissimo che per dire le cose in maniera semplice avrei finito per infilarci qualche immensa castroneria!

      • Gemxha

        Ma tutto ciò vale praticamente solo in teoria.. Nel senso, nella stragrande maggioranza dei casi l’sql injection così alla brutta (soprattutto nel caso dell’esempio col DROP TABLE) fallisce perchè generalmente l’utente che esegue la query non ha abbastanza privilegi per dare quel comando.

        Tuttavia una roba tipo “; SELECT * FROM ‘users’;–” potrebbe funzionare perfettamente e anzi a volte funziona. C’è solo da tirare a indovinare i nomi delle tabelle o tentare con un LIST.

        Personalmente ho provato sui siti che amministro (che però o son fatti con Drupal o sono WordPress, non ho online nulla di fatto da me che acceda ad un DB) e non c’è verso. Segno che probabilmente l’input dei vari campi è stato, come si dice “sterilizzato”. Di base basta fare una regexp che seghi i carateri “*” ed “;” o che li converta nell’equivalente html (in modo da renderlo un carattere valido ad es. nelle password.

        Dimenticavo: c’è anche di PEGGIO. http://www.soft-land.org/storie/09/story12

        • http://www.newfractals.net Elena Itzcovich

          Beh, come dicevo all’inizio, questo post non è una guida di hacking, ma una spiegazione del principio che sta alla base della SQL injection. Sullo “sterilizzare” grazie per il termine: come vedi appare nel fumetto in inglese, ma nella traduzione in italiano ho usato un giro di parole.

          Mi rassicura che Drupal e WordPress sterilizzino l’input dei vari campi, sono così diffusi che se non lo facessero succederebbero macelli di continuo… Il problema credo non siano le piattaforme più note, ma cose fatte ad hoc per una azienda da qualche programmatore sprovveduto.

          Grazie per il link.

          Se vuoi un esempio di problemi di sicurezza informatica ancora peggiore, prosegui su: http://www.newfractals.net/universita-e-sicurezza-telematica/

          • Genxha

            Ah, a proposito, hanno fatto un defacement al sito del SUN, il giornale inglese 😀

          • http://www.newfractals.net Elena Itzcovich

            Beh, oddio, chiamarlo giornale mi sembra un po’ eccessivo ;-P