はじめに
sqlmap は、SQL インジェクションの脆弱性を検出し、悪用するプロセスを自動化する強力なオープンソースのペネトレーションテストツールです。デフォルトでは、sqlmap は一度に 1 つのリクエストを送信し、テストを逐次的に実行します。これは信頼性がありますが、特に複雑な Web アプリケーションや時間ベースのブラインドインジェクションテストを実行する際には、時間がかかることがあります。
この実験では、--threads オプションを使用して sqlmap スキャンを大幅に高速化する方法を学びます。このフラグにより、sqlmap は複数の HTTP リクエストを同時に実行でき、スキャン完了に必要な全体時間を劇的に短縮できます。さまざまなスレッド数で一連のスキャンを実行し、結果を比較してパフォーマンスの向上を直接確認します。
シングルスレッドでのベースラインスキャンを実行する
このステップでは、デフォルト設定のシングルスレッドを使用して基本的な sqlmap スキャンを実行します。これは、後続のステップでのパフォーマンス向上を測定するためのベースラインとして機能します。スキャンの所要時間を正確に測定するために time コマンドを使用します。
まず、ターミナルで以下のコマンドを実行します。このコマンドは、sqlmap に対して指定された URL (-u) をスキャンし、データベースを列挙 (--dbs) し、非対話モード (--batch) で実行するように指示します。出力をログファイルにリダイレクトし、time コマンドを使用して実行時間も測定します。
(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch) 2>&1 | tee baseline_scan.log
スキャンが完了すると、sqlmap から多くの出力が表示され、最後に時間測定が表示されます。以下のような形式になります。
... (sqlmap output) ...
[22:30:00] [INFO] fetching database names
[22:30:00] [INFO] the SQL query used returns 2 entries
[22:30:00] [INFO] retrieved: information_schema
[22:30:00] [INFO] retrieved: acuart
[22:30:00] [INFO] available databases [2]:
[*] acuart
[*] information_schema
[22:30:00] [INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/testphp.vulnweb.com'
[*] ending @ 22:30:00 /2023-10-27/
real 0m45.123s
user 0m5.456s
sys 0m0.789s
私たちにとって最も重要な値は real であり、これはかかった総経過時間を示します。次に、この結果を比較ファイル scan_times.log に保存します。
echo "Baseline (1 Thread): $(grep real baseline_scan.log | awk '{print $2}')" >> scan_times.log
最後に、ログファイルの内容を表示して、ベースライン時間が記録されていることを確認します。
cat scan_times.log
出力には記録された時間が表示されるはずです。
Baseline (1 Thread): 0m45.123s
--threads フラグの目的を理解する
このステップでは、この実験の主要な機能である sqlmap の --threads フラグについて理解を深めます。このステップで実行するコマンドはありません。目的は、適用する前に概念を理解することです。
--threads オプションは、スキャン中に sqlmap が実行する同時 HTTP(s) リクエストの数を設定するために使用されます。デフォルト値は 1 です。
仕組み: sqlmap は、1 つのリクエストを送信して応答を待ってから次のリクエストを送信するのではなく、複数の「スレッド」を開いて同時に複数のリクエストを送信できます。この並列処理は、次のような多くのリクエストを伴うタスクに特に効果的です。
- 脆弱性のファジング。
- データベース名の文字のブルートフォース(ブラインド SQL インジェクション)。
- 大量のデータの抽出。
利点:
- 速度: 主な利点は、スキャン時間の劇的な短縮です。
- 効率: ネットワーク接続とシステムリソースをより有効に活用できます。
考慮事項:
- リソース使用量: スレッド数を増やすと、CPU とメモリの使用量が増加します。
- ターゲットの安定性: スレッド数が非常に多いと、脆弱または設定が不十分な Web サーバーを過負荷にし、サービス拒否(Denial of Service)を引き起こす可能性があります。
- 検出: アグレッシブなマルチスレッドスキャンは、Web アプリケーションファイアウォール(WAF)または侵入検知/防止システム(IDS/IPS)によって検出およびブロックされる可能性が高くなります。
sqlmap では、スレッド数を 1 から最大 10 まで設定できます。次のステップでは、この値を調整することがスキャンパフォーマンスにどのように影響するかを確認します。
スレッド数を増やしてスキャンを再実行する (--threads=5)
このステップでは、--threads フラグに関する知識を応用します。以前と同じスキャンを再実行しますが、今回は同時リクエスト数を 5 に増やします。
ターミナルで以下のコマンドを実行します。これは最初のコマンドと同一ですが、--threads=5 が追加されています。
(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch --threads=5) 2>&1 | tee 5_threads_scan.log
スキャンが完了したら、real の時間がベースラインスキャンよりも大幅に短くなっていることに気づくはずです。
次に、比較のためにこの新しい結果を scan_times.log ファイルに追加しましょう。
echo "5 Threads: $(grep real 5_threads_scan.log | awk '{print $2}')" >> scan_times.log
両方の結果を確認するために、再度ログファイルの内容を確認しましょう。
cat scan_times.log
出力には、ベースラインと 5 スレッドのスキャン時間の両方が表示されるはずです。
Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
(注意:時間は変動しますが、顕著な減少が見られるはずです。)
最大スレッド数でスキャンを再実行する (--threads=10)
このステップでは、sqlmap で許可されている最大スレッド数である 10 を使用して、パフォーマンスを限界まで引き上げます。これにより、通常の条件下でこのオプションを使用して達成できるピークパフォーマンスの向上を示すことができます。
スレッド数を 10 に設定して、スキャンコマンドを最後に実行します。
(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch --threads=10) 2>&1 | tee 10_threads_scan.log
このスキャンは、以前のスキャンよりもさらに高速になるはずです。完了したら、結果をログファイルに記録します。
echo "10 Threads: $(grep real 10_threads_scan.log | awk '{print $2}')" >> scan_times.log
次に、scan_times.log ファイルを表示して、3 つの結果すべてをコンパイルしたものを見てみましょう。
cat scan_times.log
出力には 3 つのエントリすべてが含まれるようになり、次のステップでそれらを簡単に比較できます。
Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
10 Threads: 0m9.789s
(注意:時間は変動します。)
スキャン時間を比較し、パフォーマンスの変化を記録する
この最終ステップでは、収集したデータを分析して、sqlmap におけるマルチスレッドの効果についての結論を導き出します。
scan_times.log に保存された最終結果を表示しましょう。
cat scan_times.log
以下のような出力が表示され、各スキャンの時間が明確に示されます。
Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
10 Threads: 0m9.789s
(注意:正確な時間はネットワーク状況やシステム負荷によって異なりますが、傾向は明確になるはずです。)
分析: 結果からわかるように、スレッド数を増やすにつれてスキャン時間は劇的に短縮されています。
- 1 スレッドから 5 スレッドへの移行は、最も顕著なパフォーマンス向上をもたらした可能性が高いです。
- 5 スレッドから 10 スレッドへの移行でも改善は見られますが、それほど顕著ではないかもしれません。これは、スレッド数以外の要因、例えばネットワーク遅延やサーバーが同時リクエストを処理する能力などがボトルネックになり始めるためです。
この実験は、--threads フラグを使用することが、sqlmap スキャンを最適化するためのシンプルかつ非常に効果的な方法であることを明確に示しています。
まとめ
この実験の完了、おめでとうございます!sqlmap のスキャンパフォーマンスを並列リクエストを使用して最適化する方法を習得しました。
この実験では、以下のことを行いました。
- パフォーマンスのベンチマークを確立するために、シングルスレッドでのベースラインスキャンを実行しました。
--threadsフラグの目的、その利点、および考慮事項について学びました。- スキャン時間に与える影響を観察するために、5 スレッドと 10 スレッドでスキャンを実行しました。
- 結果を比較し、スレッド数を増やすことでスキャン時間が大幅に短縮されることを確認しました。
--threads のようなオプションを習得することは、効率的かつタイムリーなペネトレーションテストを実施するために不可欠です。過度なスキャンはターゲットシステムに悪影響を与える可能性があるため、この力を責任を持って使用することを忘れないでください。


