SQL Injector MT, un piccolo tool per l’exploit di falle Blind SQL Injection

luglio 20, 2009 Scripting e dintorni, Security

Dopo un lungo sviluppo ho deciso che il mio personalissimo tool, da me con poca fantasia denominato SQL Injector MT, è pronto per essere pubblicato e donato alla rete. Ce ne sono tanti di questi programmini, più o meno complessi, con o senza interfaccia grafica, con o senza il supporto al multithreading. Quindi, vi chiederete voi, a cosa serviva farne un altro?

sqlinjection

La ragione più importante è quella della formazione: programmare e testare un tool di questo tipo da un lato aiuta a farsi le ossa su un linguaggio di programmazione che, all’inizio dello sviluppo, conoscevo poco ( sto parlando di PERL ), permette di capire come funziona il meccanismo per lo sfruttamento della vulnerabilità e dà qualche base sulla scrittura di exploit mentre dall’altro ci consente di creare lo strumento più adatto alle nostre esigenze personali.

Ecco di seguito le caratteristiche principali di SQL Injector MT:

  • Funzionamento da riga di comando
  • Multithreaded
  • Supporto per attacchi Blind SQL Injection time-based ( con l’uso di BENCHMARK )
  • Supporto per più DBMS ( MySQL, Oracle, PostgreSQL, MSSQL, e Access ( quest’ultimo limitato )
  • Possibilità di inserire automaticamente stringhe non quotate ( vedi esempio )
  • Supporto ai cookies
  • Possibilità di inserire l’injection nella querystring, nel contenuto della richiesta POST oppure nei cookies
  • Scrittura risultati su file
  • Supporto per raccolta di più righe tramite un iteratore ( vedi esempio )
  • Supporto proxy HTTP

Lo script è stato testato su Windows utilizzando ActiveState ActivePerl 5.10. Di seguito i moduli richiesti:

  • PERL >= 5.8
  • LWP::UserAgent
  • URI
  • Options
  • HTTP::Request::Common
  • CGI::Enurl
  • POSIX

COME FUNZIONA

Riporto qui sotto il messaggio di help completo di SQL Injector MT:

Usage: sql_injector_mt.pl [options]
Options:
  -b, --reverse-behaviour  Considers TRUE the case when the chosen world DOES NOT appear in the response
  -i, --ignore-case        Ignore case in the extracted strings to reduce characters range
  -h, --help               Print a help message
  -v, --verbose            Print every uri requested during the process
  -k, --time-based         Use time-based Blind SQL Injection
  -m, --comment-spaces     Replace every space with /**/ MySQL multiline comment
  -p, --path               The path of the vulnerable page.    [required]
  -q, --query              The query string ( or request content if POST )
  -t, --type               The request type [default: GET]
  -r, --parameter          The researched parameter    [required]
  -g, --good-guy           Pick a word from the correct response, can be a regex. Needed if -k is not enabled
  -s, --start              Set the position of the first char to retrieve [default: 1]
  -x, --proxy              Proxy server in the http:/domain:port format
  -d, --dbms               The target DBMS [default: mysql]
  -c, --cookie             Cookie content
  -n, --bench-num          Number of times to execute the MD5 function in BENCHMARK ( only applicable when using
                           time-based SQL Injection, the -k flag must be enabled ) [default: 300000]
  -i, --iterator-start     First row to grab [default: 1]
  -e, --iterator-end       Last row to grab. Must be greater than iterator-start [default: 1]
  -o, --output             Output file
  -T, --threads            Number of threads [default: 4]

Ecco un esempio di comando:

perl sql_injector_mt.pl -p "http://localhost/test_sql_inj_mt.php" -q "id=1 <{SQLi}>" -g "yes" -T 4
-r "select bar from foo limit 1 offset <{i}>" --iterator-start zero --iterator-end 1 --verbose

Il comando sopra sfrutta una vulnerabilità Blind SQL Injection nella pagina presente all’indirizzo http://localhost/test_sql_inj_mt.php tramite richieste di tipo POST il cui contenuto è “id=1 <{SQLi}>” dove il segnaposto <{SQLi}> viene di volta in volta sostituito dallo script con il payload. Il parametro -r rappresenta il valore che vogliamo recuperare con il nostro exploit, in questo caso il campo bar della tabella foo ( importante la clausola “LIMIT 1″ per ottenere solo un campo alla volta ). Il segnaposto <{i}> rappresenta invece un iteratore che nel nostro caso viene sostituito inizialmente con 0 ( impostato tramite –iterator-start ) fino al valore impostato con –iterator-end. Non ho messo 0 come numero perchè il modulo Options non sembrava accettarlo quindi ho messo in piedi un piccolo workaround a cui dedicherò più attenzione in futuro :-) Infine il parametro -g rappresenta il contenuto la cui presenza è nota nella pagina richiamata quando la query del payload restituisce un valore TRUE ( questo lo potete ottenere con delle verifiche manuali in attesa che aggiunga la possibilità di un riscontro automatico ). Nel caso della pagina di test compare appunto la scritta “yes” ( senza virgolette ).

TUNING

E’ possibile migliorare le prestazioni del programma se è noto l’intervallo di caratteri di cui è composta la stringa che stiamo andando a recuperare. Ad esempio è possibile impostare il flag –ignore-case per ignorare le differenze tra lettere minuscole e maiuscole, in tal modo riducendo l’intervallo possibile dei caratteri e diminuendo il numero di richieste necessarie per recuperare il singolo valore. Un’altra possibilità è quella di editare il codice sorgente e modificare le due variabili poste poco sotto la testata:

our $hchar = 126; #tilde
our $lchar = 32; #space

$hchar rappresenta il limite superiore mentre $lchar rappresenta il limite inferiore, entrambi rappresentati come codice ASCII del corrispondente carattere. Con la configurazione di default l’intervallo è tra il carattere “spazio” e il carattere “tilde”, compresi.

CONVERSIONE AUTOMATICA DELLE STRINGHE

Se come parametro -q immettete una stringa contenente un’espressione del tipo <|STRINGA|> il contenuto posto all’interno dei due delimitatori <| e |> sarà automaticamente convertito in una rappresentazione di stringa senza virgolette, in modo dipendente dal DBMS impostato ( parametro -d ). Ad esempio immettendo <|ASD|> con DBMS mysql si otterrà:

CHAR(65,83,68)

mentre per la stessa stringa con DBMS Oracle si avrà

CHR(65)||CHR(83)||CHR(68)

Tutto questo per rendere più semplice la scrittura dei comandi ed evitare di dover effettuare tali conversioni manualmente o con un tool esterno.

A CHI SI RIVOLGE

SQL Injector MT non è adatto ai principianti. E’ necessario conoscere le basi dell’SQL Injection e avere una buona dimestichezza con SQL per sfruttarlo pienamente e per non impazzire ;-)

COME OTTENERLO

SQL Injector MT è disponibile per il download, nella sua versione 1.6.0,  qui.

CRITICHE/CONSIGLI/BUG

Per qualunque critica ( costruttiva ) o consiglio o dubbio o bug scrivete pure un commento a questo post.

Tags: , , ,

Comments (1)

 

  1. super!, grazie delle buone info

Leave a Reply

*