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?
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.
Comments (1)


super!, grazie delle buone info