Sei sulla pagina 1di 5

INTRODUZIONE ALLE BLIND SQL INJECTIONS evilsocket http://www.evilsocket.net/ .: Introd !

ione Salve a tutti, scrivo questo paper per chiarire, almeno injection e di blind sql injection, nonch la logica che c "er poter comprendere al meglio questa guida, ! necessaria conoscen#a del linguaggio S$% e di un minimo di php per la .: Concetto 'gni sito in php che si rispetti, elabora e visuali##a i propri contenuti appoggiandosi su un database, solitamente (&S$%, che contiene dati come il contenuto degli articoli, delle news e quasi sempre gli account degli utenti e degli amministratori . 'vviamente il sistema di gestione di questi dati necessita dei parametri in ingresso per sapere cosa e/o come visuali##are, parametri che possono essere passati con la classica richiesta "ET http://www.sito.com/news.php)id#$%
(in questo caso la pagina selezioner l'articolo avente un id uguale a 23)

spero XD, il concetto di sql ! dietro a questa tecnica . da parte del lettore una minima gestione delle quer& .

o con una richiesta &OST di un *orm html : ... +*orm method,-&OST- action,-news.php-. +input t&pe,-te/t- name,-id- value,-$%- /. +input t&pe,-submit- value,-0isuali##a news-. +/*orm. ...
(in questo caso la pagina selezioner l'articolo avente un id uguale a 23)

1ali parametri poi dovranno essere elaborati dalla pagina che li riceve venendo inseriti in una quer& sql di sele#ione . 0ediamo un po un piccolo esempio in php di come 2potrebbe- essere una generica pagina 2news.php- : '()*) /* usare l'oggetto $_POS 3id , 345617 id 89 se la ric!iesta " in post */

/* ### qui viene gestita la connessione al d$ ### */ 3result , m&sql4quer&:2S6%6;1 < =>'( tabella4news ?@6>6 news4id,+id-A9 /* ### qui viene gestita la lettura del recordset e la visualizzazione ### */ (, ;ome vedete da questo semplice esempio, la pagina prende i dati in ingresso e li usa, come dicevamo, per eseguire la quer& al database . 6ssendo questi dati inviati dal nostro browser, possono essere manipolati a nostro piacimento, tale manipola#ione mirata prende il nome di S$% Bnjection :letteralmente 2inie#ione di sql-A . Cn esempio di questa manipola#ione puD essere il seguente :

http://www.sito.com/news.php)id#$% or -#-

0ediamo come questa injection va a tras*ormare la quer& dell esempio precedente : 2S6%6;1 < =>'( tabella4news ?@6>6 news4id,+iddiventa 2S6%6;1 < =>'( tabella4news ?@6>6 news4id,$% or -#-;osa che 2*or#a- la quer& E'E a sele#ionare la news numero FG come ci si aspetta che *accia, bensH a sele#ionare il primo oggetto della tabella data la condi#ione booleana 2or I,I- che ! sempre vera . Jbbiamo quindi visto come si possa manipolare il comportamento di uno script php modi*icando ad hoc i parametri passati in input ... per *arvi notare la poten#ialitK della tecnica in questione, voglio *arvi un esempio piL pratico : login.php '()*) 3username , 345617 user 89 3password , 345617 password 89 /* ### qui viene gestita la connessione al d$ ### */ 3result , m&sql4quer&:2S6%6;1 < =>'( tabella4utenti ?@6>6 user, + sern./e0 JED password#0+).ss1ord0-A9 /* ### qui viene gestita la lettura del recordset e l'accesso utente ### */ (, 6 conseguente sql injection : http://www.sito.com/login.php)user,Mpassword,0 or 00#0 ;he andando a *inire nella quer& vi garantirebbe l accesso sen#a avere alcuna creden#iale vera e propria tras*ormando la quer& cosH : 2S6%6;1 < =>'( tabella4utenti ?@6>6 user, + sern./e0 JED password#0+).ss1ord0diventa 2S6%6;1 < =>'( tabella4utenti ?@6>6 user, 0 JED password#00 or 00#00-

.:

Blind SQL In2ections

Eel precedente paragra*o abbiamo visto una normale sql injection, che nonostante le sue poten#ialitK resta comunque limitata . %a variante piL e**iciente e piL di**icile da attuare assume l aggettivo di 2blind:ciecaA dato che letteralmente, nel caso di un attacco di questo tipo, si procede alla cieca . ;ome dicevo, una sql injection normale ! limitata, anali##iamo la seguente situa#ione . 0olete in*iltrarvi nel pannello di gestione di un determinato sito, ma la pagina login.php non ha di*etti che vi permettono di iniettare del sql ... di di*etti ne avete trovati solo nella pagina news.php del sito . $uindi vi domandate 2a che cavolo mi serve iniettare del codice nella gestione delle news )N)N))N- serve eccome :" N Bn questo caso ci viene in aiuto la struttura semantica del (&S$% con il suo 2UNION ALL SELECT-, prendiamo la descri#ione di tale opera#ione che c ! sulla documenta#ione del m&sql :

2%&'O& is used to co($ine t!e result )ro( (ultiple S*+*, state(ents into a single result set# !e colu(n na(es )ro( t!e )irst S*+*, state(ent are used as t!e colu(n na(es )or t!e results returned# Selected colu(ns listed in corresponding positions o) eac! S*+*, state(ent s!ould !ave t!e sa(e data t-pe# (.or e/a(ple0 t!e )irst colu(n selected $- t!e )irst state(ent s!ould !ave t!e sa(e t-pe as t!e )irst colu(n selected $- t!e ot!er state(ents#)1 tradotto 2 3%&'O& " usato per co($inare il risultato di dic!iarazioni S*+*, (ultiple dentro un unico result set # ' no(i delle colonne della pri(a dic!iarazione S*+*, sono usati co(e no(i di colonna per i risultati otttenuti # +e colonne selezionate elencate nella posizione corrispondente di ogni dic!iarazione S*+*, dovre$$ero essere dello stesso tipo# (Per ese(pio0 la pri(a colonna selezionata dalla pri(a dic!iarazione dovre$$e essere dello stesso tipo della pri(a colonna selezionata dalle altre dic!iarazioni#)1radotto in parole povere, con le accorte##e necessarie si possono concatenare delle select su tabelle diverse tramite una CEB'E J%% S6%6;1 . Jd esempio : S6%6;1 < =>'( tabellaI CEB'E J%% S6%6;1 < =>'( tabellaF ;he come potete ben capire, sele#iona dei dati sia dalla tabellaI che dalla tabellaF restituendo un unico recordset . Cna nota I3&ORTANTE da *are ! che, per sua natura, la CEB'E J%% S6%6;1 ha alcuni requisiti per *un#ionare . Bl piL importante :oltre ovviamente ad una corretta sintassi delle due selectA ! che il numero dei campi sele#ionati dalla prima select, deve essere lo S16SS' di quello dei campi sele#ionati dalla seconda select . 6sempio : SBAGLIATO S6%6;1 nome,cognome =>'( tabellaI CEB'E J%% S6%6;1 numero =>'( tabellaF GIUSTO S6%6;1 nome,cognome =>'( tabellaI CEB'E J%% S6%6;1 numero,data =>'( tabellaF 'vviamente la prima quer& restituirK un errore sintattico dato che la prima select va a prelevare due campi :nome e cognomeA mentre la seconda solo uno :numeroA . Bnvece nella seconda quer& tutto andrK liscio come l olio dal momento che sia la prima che la seconda select prelevano due campi :rispettivamente nome, cognome e numero,dataA . 6d ecco che arriviamo al concetto di blind sql injection N Eella circostan#a precedente, possiamo *or#are news.php a sele#ionare dei dati anche dalla tabella utenti, concatenando la nostra select iniettata con una CEB'E J%% S6%6;1 come nel seguente esempio :
http://www.sito.com/news.php)id#$% UNION ALL SELECT ser4).ss1ord 5RO3 t.6ell.7 tenti

1ale tipo di quer& perD ci restituirK un errore dal momento che ! alquanto improbabile che la select sulla tabella4utenti prelevi lo stesso numero di campi :user,password quindi FA della prima select sulla tabella4news poich la quer& completa diventerebbe una cosa del tipo :
2S6%6;1 < =>'( tabella4news ?@6>6 news4id,FG CEB'E J%% S6%6;1 user,password =>'( tabella4utenti-

$undi il nostro obiettivo diventa deter/in.re 8 .nti c./)i sele!ion. l. )ri/. select per apportare le giuste modi*iche alla select che vogliamo iniettare nella quer& *inale . 6 qui, come accennavo prima, si procede alla cieca :" ... ovvero si parte da un campo continuando ad aggiungere campi alla seconda select *ino a quando, invece del messaggio di errore di sintassi nella quer&, ci troviamo davanti la pagina con i risultati che vogliamo . Bl passaggio potrebbe essere una cosa del genere :
http://www.sito.com/news.php)id,FG UNION errore di sintassi !ttp2//444#sito#co(/ne4s#p!p5id623 UNION errore di sintassi http://www.sito.com/news.php)id,FG UNION errore di sintassi http://www.sito.com/news.php)id,FG UNION visualizzazione dei dati (query eseguita ALL SELECT ALL SELECT ALL SELECT ser4).ss1ord 5RO3 t.6ell.7 tenti ser4).ss1ord49 5RO3 t.6ell.7 tenti ser4).ss1ord494- 5RO3 t.6ell.7 tenti

ALL SELECT ser4).ss1ord494-4$ 5RO3 t.6ell.7 tenti con successo

;ome vedete, andando a tentativi :quindi alla ciecaA, siamo giunti alla quer& corretta :
*tt):::111.sito.co/:ne1s.)*)(id#$% UNION ALL SELECT ser4).ss1ord494-4$ 5RO3 t.6ell.7 tenti quindi 3S6%6;1 < =>'( tabella4news ?@6>6 news4id,FG CEB'E J%% S6%6;1 user,password,O,I,F =>'( tabella4utenti-

6 possiamo dedurre che la prima select :S6%6;1 < =>'( tabella4newsA preleva P campi dalla tabella e, dato che viene *atta una select completa con il carattere <, possiamo di conseguen#a dedurre che la tabella4news sia *ormata proprio da P colonne . .: L0In;or/.tion Sc*e/. Bn realtK, nei casi reali, c ! un altra complica#ione ... che non sappiamo come si chiamano le tabelle N Eegli esempi il tutto era relativamente semplice poich dal codice che vi ho mostrato sapevamo che le due tabelle si chiamavano tabella4news e tabella4utenti, ma nei casi reali non avendo accesso al codice delle pagine, non sappiamo su quali tabella vanno ad operare . Bn questo caso ci viene in aiuto il cosiddetto In;or/.tion Sc*e/. . % in*ormation schema ! un database che si trova su ogni server (&S$% dal momento della prima istalla#ione e contiene, guarda caso, delle tabelle con in*orma#ioni sulla struttura degli altri dati presenti negli altri database . Eel caso speci*ico, dobbiamo visuali##are il contenuto della tabella in*ormation4schema.tables che contiene il campo table4name, ovvero la lista di tutte le tabelle presenti nel db ... BIN"O N S*ruttando una quer& del genere :
*tt):::111.sito.co/:ne1s.)*)(id#$% UNION ALL SELECT t.6le7n./e494-4$4% 5RO3 in;or/.tion7sc*e/..t.6les

Jvremo la lista di tutte le tabella presenti nel db, e vedremo comparire come per magia il nome della nostra tabella4utenti . 'k, sappiamo da quale tabella prelevare i dati ... ma come si chiamano i dati )NN))N Eon abbiamo il nome dei campi ... niente, paura, ci viene in contro in*ormation4schema.columns, ovvero la lista dei nomi delle colonne per ogni tabella, quindi eseguiremo la seguente quer& :
*tt):::111.sito.co/:ne1s.)*)(id#$% UNION ALL SELECT col /n7n./e494-4$4% 5RO3 in;or/.tion7sc*e/..col /ns 1*ere t.6le7n./e#0t.6ell.7 tenti0

6 *inalmente sapremo sia da quale tabella prelevare i dati, sia il nome dei dati della tabella che ci interessa .

Bn conclusione, spero che questa guida aiuti qualcuno a chiarirsi le idee su cosa sia una sql injection, una blind sql injection e come adoperarle per ottenere in*orma#ioni utili . evilsoc!et