
ISR-sqlget É uma ferramenta de injeção SQL cega desenvolvida em Perl.
-- ISR - Infobyte Security Research -- | ISR-sqlget | www.infobytesec.com |
..:: DESCRIÇÃO
ISR-sqlget: é uma ferramenta de injeção SQL cega desenvolvida em Perl. Permite obter esquemas de bancos de dados e linhas de tabelas. Usando um único GET/POST, você pode acessar discretamente a estrutura do banco de dados e, usando um único GET/POST, pode extrair cada linha de tabela para um arquivo semelhante a CSV.
Bancos de dados suportados:
- 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)
Recursos de evasão:
- Codificação Unicode de largura total/meia largura
- Bypass de CR não padrão do Apache
- Bypass do mod_security
- Transformação aleatória de requisição em maiúsculas
- PHP Magicquotes: codifica cada string usando a função CHR do banco de dados ou similar.
- Converte requisições em valores hexadecimais
- Evita a substituição de espaço por /**/ ou tabulação (\t)
- Evita a concatenação sem usar || ou +, utilizando a função concat do banco de dados ou similar.
- User-agent aleatório
- Servidor proxy aleatório
- Atraso aleatório de requisição
Recursos comuns:
- Blacklist de download de esquemas do banco de dados
- Suporte a array de cookies
- Suporte a SSL
- Suporte a servidor proxy
- Informações do banco de dados exportadas em formato CSV
Relatórios:
- Representação gráfica da estrutura do banco de dados para criação de relatórios executivos de impacto
requer a biblioteca Graphviz (http://www.graphviz.org/)
..:: USO
A ferramenta precisa das seguintes informações:
As possíveis AÇÕES são:
Primeiro:
1. Obter o esquema do banco de dados.
Depois:
2.a Obter as linhas das tabelas (formato csv).
2.b Obter o gráfico do esquema do banco de dados.
..::Exemplo:
Código-fonte do helloworld.php:
Veja o exemplo de sessão (arquivo de configuração): ./helloworld.pm
Obter o esquema do banco de dados:
; 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#
Isso gera um arquivo de esquema local em: ./template/helloworld.dbschema
Em seguida, obtenha as linhas das tabelas:
; 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 ;------------------------------------------------------------------------------------------------------------------------------ ;.....
No diretório "./datos/", você terá dois arquivos por tabela, como segue:
[sessionname].[database].[table].sql.html # html source
[sessionname].[database].[table].csv # commad separated values
Observe que "./datos" pode ser especificado com o parâmetro $conf::outputdb no arquivo de configuração da sessão.
..:: Avançado
A ferramenta usa apenas um tipo de coluna text/varchar/etc na consulta SQL SELECT. Usando sentenças UNION, você pode obter "nessa coluna" todo o esquema do banco de dados usando "[__]" como delimitador.
Quando você já tiver salvo o esquema do banco de dados local, poderá:
1.a Obter as linhas das tabelas: Usando a mesma técnica, você pode obter todas as linhas de todas as tabelas do banco de dados. As colunas com tipos de dados que não são compatíveis com texto são transformadas no tipo de dados texto usando funções próprias do banco de dados.
1.b Obter o gráfico do esquema do banco de dados.
A ferramenta usa um arquivo de configuração de sessão para cada ação. Este arquivo de configuração define os parâmetros necessários para explorar a injeção SQL. O parâmetro @conf::path especifica a forma como o HTML bruto é analisado para trabalhar com a ferramenta.
Detalhes da ajuda:
Uso: ./ISR-sqlget.pl [ACTION] [OPTIONS]
Ação: -c: Verifica o módulo do parser -t: Obtém a página de teste -a: Obtém todos os nomes de bancos de dados (apenas mssql) -s: Obtém a(s) estrutura(s) do(s) banco(s) de dados -d: Obtém a(s) informação(ões) do(s) banco(s) de dados (formato csv) -g: Estrutura gráfica do banco de dados (formato gif)
Opções: -n: Nome da sessão -p: (Use com a ação -c, especifique a página de origem para verificar o módulo); Padrão ./template/$SESSION.testpage -v: Verboso -h: Ajuda
-t: Usando o arquivo de sessão, você obtém uma breve tabela de dados do sistema para ser usada com a ação "-c" para analisar o HTML bruto posteriormente.
-c: Por padrão, use ./template/[session-name].testpage. É usado para desenvolver e testar o parser de HTML bruto. Você pode escolher outro arquivo html usando a opção "-p".
-a: Todos os mecanismos de banco de dados usam a seguinte ordem para obter as linhas das tabelas: 1. "-s" obtém a estrutura (salva o esquema do banco de dados em um arquivo local). 2. "-d" obtém os dados das tabelas.
Devido às tabelas de sistema do MSSQL, precisamos adicionar uma etapa anterior:
1. "-a" obtém todos os nomes de bancos de dados de /schema/catalog (salva os nomes em um arquivo local).
2. "-s" obtém a estrutura (salva o esquema do banco de dados em um arquivo local).
3. "-d" obtém os dados das tabelas.
-s: obtém a estrutura (salva o esquema do banco de dados em um arquivo local).
-d: obtém os dados das tabelas.
-g: Usa o arquivo de esquema do banco de dados local obtido anteriormente para obter o gráfico do esquema do banco de dados (formato gif)
-n: Especifica o nome do arquivo de configuração da sessão.
..:: Notas
./pmschanges.txt: Usamos uma versão modificada do LWP, Net::HTTP que inclui métodos e especificações de CRLs. Este arquivo explica as modificações.
./dbs/isr_*: Cada módulo de banco de dados tem a variável @space que especifica o tipo de espaço válido. Exemplo: my @space=(' ',"\t","/**/"); #todos os espaços
..:: Opções do arquivo de sessão:
@conf::path #O parâmetro @conf::path especifica a forma como o HTML bruto é analisado para trabalhar com a ferramenta. #Ele usa código perl embutido com HTML::TreeBuilder para analisar o HTML bruto. #A primeira configuração é um array de árvore com os nomes das tags html necessárias. O último nome de tag html é processado com o código perl.
Veja exemplos em ./examples/ example[n].html session[n].pm
$conf::site #Site onde o aplicativo vulnerável está
$conf::script #Arquivo de script vulnerável
$conf::method #Método 'POST', 'GET', 'HELLO', '\r\n\r\n\r\n\r\n\r\n' (bypass de método do apache)
$conf::inj #Parâmetros POST/GET com as sentenças UNION #Ele usa variáveis que posteriormente serão substituídas pelas informações dinâmicas.
Variáveis:
<VALUE> = Coluna usada para obter todas as informações.
<TABLE> = Seção de tabelas.
<WHERE> = Seção WHERE.
<TAIL> = A última parte da sentença SQL.
Exemplo: "id=1') union select <VALUE>,'a' from <TABLE> <WHERE> <TAIL> --";
$conf::where #Se você precisar adicionar alguma exceção na tabela union, use este #parâmetro porque há algumas consultas de estrutura de banco de dados que têm "WHERE" incluído
$conf::tail #A última parte da sentença SQL. $conf::param #Estilo do parâmetro = Estilo Post 1, Estilo Url 0 Estilo 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
Estilo 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 do banco de dados
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 da sessão (Você deve usar o mesmo nome do arquivo de configuração da sessão sem a extensão .pm) $conf::outputdb #O caminho das linhas das tabelas exportadas
######### proxy $conf::proxy_host #Exemplo de suporte a proxy: 'http://user:pass@host:port/'; $conf::rproxy #Proxy aleatório 1 ativa ou 0 desativa $conf::rproxyfile #Arquivo de proxy aleatório (Use o mesmo formato que $conf::proxy_host)
######### filtros $conf::space #Evitar espaço: 0 habilita espaço ou 1 substitui espaço ' ' por tab '\t ou #2 substitui espaço ' ' por comentário '/**/'
$conf::apache_espace #Você pode especificar o valor dos CRs na requisição HTTP/s
#Exemplo:
$conf::apache_espace_rnd=1; #combinação aleatória de CRs 0x0b, 0x0c, 0x0d $conf::apache_espace_rmaxn=10; #Número máximo aleatório de caracteres #Neste exemplo, randomizamos os CRs (0x0b, 0x0c, 0x0d) de 1 a 10: #Referência: http://www.osvdb.org/25837
$conf::mod_security #1 habilita bypass do modsecurity <= 2.1.0 & (=>PHP 5.2.0||PERL||Python) #Referência: http://www.php-security.org/MOPB/BONUS-12-2007.html
$conf::full_width #1 habilita bypass de codificação full-width $conf::ruseragent #1 habilita o uso de user agent aleatório $conf::ruseragentfile #Lista de arquivos de user agent $conf::uagent #User agent padrão $conf::delay #Atraso entre conexões $conf::rdelay #1 habilita atraso máximo aleatório entre conexões, use $conf:delay como valor máximo. $conf::magicquotes #1 habilita evitar magicquotes (use a função CHR ou similar em cada banco de dados) $conf::convertall_hex #1 transforma cada valor de parâmetro em formato hexadecimal (%41,%61) $conf::rnd_uppercase #1 habilita transformação aleatória em maiúsculas.
######## filtros apenas mssql $conf::scape_plas #1 habilita, use a função CONCAT caso o script não possa receber '+' #(usado como concatenação de strings) $conf::convertall_str #1 habilita converter todas as colunas para string (recomendado) $conf::scape_output_less #1 habilita. Caso o script não possa enviar '|', use a função do banco de dados para substituir
######## filtros apenas oracle/db2/virtuoso/h2/mckoi/ingres/monetdb/maxdb/thinksql $conf::scape_pipe #Use a função CONCAT ou similar caso o script não possa receber '|' (usado como concatenação de strings)
$conf::deny_dbname #array que contém os nomes de bancos de dados que não devem ser processados (blacklist) Exemplo de valor = {'WMSYS' => 1, 'SYS' => 1 };
#Cookie $conf::cookie #1 habilita array de cookies @conf::cookies #array com os cookies a usar Exemplo de valor = ( { version=>undef, key=>'valu1', val=>'password', path=>'', domain=>'', port=>undef, path_spec=>undef, secure=>undef, maxage=>undef, discard=>undef, rest=>undef });
#Opções gráficas (Veja mais na ajuda do módulo Perl GraphViz) $conf::graphdir = './graph/'; #O diretório de destino dos arquivos gráficos $conf::glayout = 'dot'; $conf::grootcolor='crimson'; $conf::gdbcolor='darkgreen'; $conf::gtablecolor='olivedrab1'; $conf::gcolumncolor='lightblue2'; $conf::gcolumn=0; #0= não desenhar coluna 1= desenhar colunas
..:: REQUISITOS
1 - Módulos Perl: LWP::UserAgent HTTP::Cookies; Convert::EastAsianWidth Data::Dump GraphViz
2 - Bibliotecas Projeto GraphViz (http://www.graphviz.org/)
..:: DOWNLOAD
..:: AUTOR Francisco Amato famato+at+infobytesec+dot+com