
#BBQSQL# Blind SQL Injection エクスプロイトツール
Blind SQLインジェクションの悪用は面倒なものです。利用可能なツールがうまく動作すれば良いのですが、そうでない場合は独自のスクリプトを書く必要があります。これは時間がかかり退屈です。BBQSQLはこれらの問題に対処するのに役立ちます。
BBQSQLはPythonで書かれたBlind SQLインジェクションフレームワークです。厄介なSQLインジェクションの脆弱性を攻撃する際に非常に便利です。BBQSQLは半自動ツールでもあり、トリガーが難しいSQLインジェクションの検出結果に対してかなりのカスタマイズが可能です。データベースに依存しないように設計されており、非常に汎用性が高いです。また、直感的なUIを備えており、攻撃のセットアップがはるかに簡単です。Pythonのgeventも実装されており、BBQSQLは非常に高速です。
ツールはUIで攻撃をセットアップする際に非常にわかりやすいように設計されています。しかし、徹底性を期すために、各設定オプションの詳細について追加の洞察を提供する詳細なReadmeを用意しました。注意点として、UIのすべての設定オプションには説明が関連付けられているため、このページを読まずにツールを起動しても、攻撃を進めることができるはずです。
他のSQLインジェクションツールと同様に、特定のリクエスト情報を提供する必要があります。
通常の情報を提供する必要があります:
次に、インジェクションがどこに配置されるか、どのような構文を注入するかを指定します。詳細は以下をお読みください。
これは簡単なはずですが、何があっても大丈夫です。以下を試してください:
sudo pip install bbqsql
それがうまくいかない場合は、ソースからインストールできます。このツールにはgevent、requestsが必要です。
メニューにBBQSQLオプションの場所があります。ここで以下のオプションを指定します:
これについては、以下のクエリ構文の概要で詳しく説明します。
結果を出力するファイルの名前。ファイルに出力したくない場合は空白のままにします。
BBQSQLはBlind SQLインジェクション攻撃を実行する際に2つの手法を利用します。最初のデフォルトの手法はbinary_searchです。詳細はWikipediaを参照してください。
2つ目の手法はfrequency_searchです。頻度検索は英語の分析に基づいて、文字が出現する頻度を判断します。この検索方法は非エントロピーデータに対して非常に高速ですが、英語以外のデータや難読化されたデータに対しては遅くなる可能性があります。
このパラメータの値としてbinary_searchまたはfrequency_searchを指定できます。
これは発見したSQLインジェクションのタイプを指定します。ここでは、真偽を判断するためにbbqsqlがHTTP応答のどの属性を調べるかを設定します。
status_code、url、time、size、text、content、encoding、cookies、headers、historyを指定できます。
サーバーのステータスコードが異なるSQLインジェクションを特定した場合は、ここに'status_code'を設定します。クッキーが異なる場合は'cookie'を設定します。応答サイズが異なる場合は'size'を設定します。大体の感じはわかるでしょう。
同時実行数はPythonのgeventライブラリに基づいています。機能的にはスレッドのように動作しますが、その仕組みの詳細は[ここにリンクを挿入]のDefConトークで確認できます。この設定は攻撃の同時実行数を制御します。リクエストを調整し、攻撃時間を短縮するのに役立ちます。nginxのような非常に高性能なWebサーバーでは、同時実行数を75に設定できました。デフォルトは'30'に設定されています。
SQLインジェクションの脆弱性に奇妙な癖(特定の文字を含めることができない、ASCII/CHARなどの関数が動作しないなど)がある場合、おそらくカスタムインジェクション構文を使ったスクリプトを書いたことがあるでしょう。BBQSQLはスクリプト作成部分を排除し、カスタムクエリ構文を貼り付けて簡単に悪用する方法を提供します。
クエリ入力では、データベースから情報を抽出するために使用するクエリを構築します。すでに脆弱なパラメータでSQLインジェクションを特定し、成功するクエリをテストしていることを前提としています。
以下はクエリを構築するための例です。
この例では、攻撃者はデータベースのバージョンを選択しようとしています:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
クエリ構文はプレースホルダーに基づいており、BBQSQLに攻撃の実行方法を指示します。
攻撃を機能させるには、以下の情報のプレースホルダーを提供する必要があります。これらをクエリに配置すると、bbqSQLが残りを処理します:
${row_index}: ここでbbqSQLに行を反復するように指示します。LIMITを使用しているため、${row_index}の値に応じてn行を表示できます。
${char_index}: サブセレクトからどの文字をクエリするかをbbqSQLに指示します。
${char_val}: bbqSQLに、結果を検証するためにサブセレクトの結果と比較する場所を指示します。
${comparator}: 応答を比較して結果が真か偽かを判断する方法をbbqSQLに指示します。デフォルトでは>記号が使用されます。
${sleep}: これはオプションですが、時間ベースのSQLインジェクションを実行する際に、スリープする秒数を挿入する場所をbbqSQLに指示します。
これらのプレースホルダーのすべてが必要なわけではありません。例えば、半盲のブールベースSQLインジェクションを発見した場合、${sleep}パラメータは省略できます。
BBQSQLには攻撃のセットアップ時に設定できる多くのHTTPパラメータがあります。最低限、URL、インジェクションクエリを実行する場所、メソッドを指定する必要があります。以下のオプションを設定できます:
インジェクションクエリを挿入する場所をテンプレート${injection}を使用して指定します。インジェクションテンプレートがないと、ツールはクエリをどこに挿入すればよいかわかりません。
リクエストとともに送信するファイルを指定します。値にパスを設定すると、BBQSQLがファイルのオープン/インクルードを処理します。
リクエストとともに送信するHTTPヘッダー。文字列または辞書で指定できます。例:
{"User-Agent":"bbqsql"}
または
"User-Agent: bbqsql"
リクエストとともに送信するクッキーの辞書または文字列。例:
{"PHPSESSIONID":"123123"}
または
PHPSESSIONID=123123;JSESSIONID=foobar
リクエストを送信するURLを指定します。
HTTPリダイレクトをリクエスト時に追跡するかどうかを決定するブール値。
リクエストに使用するHTTPプロキシを辞書で指定します。例:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
リクエストとともに送信するPOSTデータを指定します。文字列または辞書で指定できます。例:
{"input_field":"value"}
または
input_field=value
HTTPリクエストのメソッドを指定します。有効なメソッドは次のとおりです:
'get','options','head','post','put','patch','delete'
HTTP基本認証に使用するユーザー名とパスワードのタプルを指定します。例:
("myusername","mypassword")
UIで攻撃を設定した後、設定ファイルをエクスポートできます。ツールを実行するとオプションが表示されます。エクスポートされた設定ファイルはConfigParserを使用しており、読みやすいです。以下に設定ファイルの例を示します:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
これは、攻撃を再開したり、クエリを調整するがすべてのオプションを再設定する手間をかけたくない場合に便利です。
コマンドラインまたはユーザーインターフェースから設定をインポートすることもできます。コマンドラインから設定をインポートするには、bbqslを以下のオプションで実行します:
bbqsql -c config_file
設定ファイルをコマンドラインまたはユーザーインターフェースから読み込むと、パラメータに対して同じ検証ルーチンが実行され、有効であることが確認されます。
時には非常に変わったことをする必要があるかもしれません。フィールドに入力する値を暗号化してからリクエストを送信する必要がある場合や、トリプルURLエンコードが必要な場合などです。いずれにせよ、これらの状況では他のツールを使用することが不可能になります。BBQSQLでは、リクエストのさまざまなポイントでツールが呼び出す「フック」関数を定義できます。例えば、リクエストを引数として受け取り、必要な変更を加え、変更されたリクエストをサーバーに送信するpre_request関数を指定できます。
これを実装するには、Pythonファイルを作成し、フック関数を指定します。利用可能な関数名は以下にリストされています。フックファイルでは、好きなだけ少なくまたは多くフック関数を定義できます。次に、メニューのbbqsql_optionsセクションで、hooks_fileの場所を指定します。BBQSQLはこのファイルを取り込み、定義されたフックを使用します。
指定するフック関数は以下の正確な名前を持っている必要があります。そうしないと、BBQSQLがどのフックをいつ呼び出すべきかわかりません。args関数は、HTTPリクエストの作成に使用されるすべての引数を含む1つのパラメータを受け取ります。pre_request関数は、リクエストが送信される前にリクエストオブジェクトを受け取ります。post_request関数は、リクエストが送信された後にリクエストオブジェクトを受け取ります。response関数は、レスポンスがBBQSQLに返される前にレスポンスオブジェクトを受け取ります。
次のフックが利用可能です:
args: Request()に送信される引数の辞書。
pre_request: 送信直前のRequestオブジェクト。
post_request: 送信直後のRequestオブジェクト。
response: Requestから生成されたレスポンス。
これらのフックの動作方法と、hooks辞書の見た目についての詳細は、requestsライブラリのフックに関するドキュメントを参照してください。
フックファイルの例は次のようになります:
# ファイル: hooks.py
import time
def pre_request(req):
"""
このフックはプレースホルダーを現在時刻に置き換えます
URLは次のようになっていることを想定しています:
http://www.google.com?k=v&time=PLACEHOLDER
"""
req.url = req.url.replace('PLACEHOLDER',str(time.time()))
return req
バグ修正や機能リクエストは https://github.com/Neohapsis/bbqsql/ に送信してください。
ぜひ! これは完全なSQLインジェクションフレームワークを構築するための素晴らしい出発点になると考えています。自由にコードをフォークし、あなたの変更が有用であればマージします。
BBQは絶品であり、SQLインジェクションも同様です!