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

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.

Articoli correlati:

  1. Miglioriamo Google con qualche piccolo userscript (Greasemonkey/Opera)
  2. Nmap 5, numero tondo per il tool più famoso tra gli hacker

Posted By Stefano Angaran

One Response to “SQL Injector MT, un piccolo tool per l’exploit di falle Blind SQL Injection”

  1. super!, grazie delle buone info

Leave a Reply




*
Get Adobe Flash playerPlugin by wpburn.com wordpress themes