Webアプリケーションのセキュリティテストにおいて、SQLインジェクションは非常に重要な脆弱性の一つです。この脆弱性を効率的に検出し、悪用するための強力なツールとして sqlmap が広く知られています。 sqlmapは非常に高機能ですが、コマンドラインでの操作が基本となるため、自動化や他のツールとの連携には一手間かかる場合があります。
そこで登場するのが sqlmapapi
です。sqlmapapiは、sqlmapの機能をRESTful JSON APIサーバーとして公開するコンポーネントです。これにより、HTTPリクエストを通じてsqlmapの機能をプログラムから制御したり、複数のメンバーで共有したり、CI/CDパイプラインに組み込んだりすることが可能になります。
この記事では、sqlmapapiの基本的な使い方から、具体的なAPIエンドポイントの利用方法、そしてその利点と注意点について詳しく解説していきます。💪
sqlmapapiとは? 🤔
sqlmapapi
は、sqlmapに同梱されているPythonスクリプト (sqlmapapi.py
) です。これを実行することで、sqlmapの各種機能を外部からHTTPリクエスト(具体的にはRESTful JSON API)経由で利用できるようになります。
簡単に言うと、sqlmapapiサーバーを起動しておけば、別のマシンやプログラムから特定のURLにアクセスするだけで、SQLインジェクションスキャンを開始したり、進行状況を確認したり、結果を取得したりできるということです。これは、sqlmap本体を直接操作する代わりに、APIを介して間接的に操作する仕組みを提供します。
sqlmapapiは主に2つのモードで動作します。
- サーバーモード (
-s
): APIリクエストを受け付け、sqlmapのタスクを実行するサーバーとして動作します。 - クライアントモード (
-c
): サーバーモードで起動しているsqlmapapiに対して、コマンドラインから対話的にリクエストを送信するクライアントとして動作します。
このAPIを利用することで、以下のようなメリットが生まれます。
- 自動化: スクリプトやプログラムからsqlmapのスキャンを自動実行・管理できます。CI/CDプロセスへの統合も容易になります。
- 連携: Burp Suite (SQLiPyプラグインなど) や OWASP ZAP といった他のセキュリティツールとの連携がスムーズになります。
- リモート実行: 特定のネットワーク環境からスキャンを実行する必要がある場合や、チームメンバー間でsqlmapインスタンスを共有したい場合に便利です。
- Web UIの構築: sqlmapapiをバックエンドとして、独自のWebベースの管理画面(GUI)を構築することも可能です。(例: SQLMAP-Web-GUI などが過去に開発されていました)
前提条件と準備 🛠️
sqlmapapiを使用するには、まずsqlmapがインストールされている必要があります。sqlmapはPythonで書かれており、Python 2.6, 2.7 および 3.x で動作します。
sqlmapのインストール
sqlmapは多くの方法でインストールできます。
-
Kali Linuxなどのセキュリティディストリビューション: 通常、標準で含まれています。含まれていない場合や最新版にしたい場合は、パッケージマネージャーでインストールできます。
sudo apt update && sudo apt install sqlmap
-
Gitリポジトリからクローン (推奨): 最新の開発版を利用できます。
この場合、git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
sqlmap-dev
ディレクトリ内でpython sqlmap.py
やpython sqlmapapi.py
を実行します。 -
pipでインストール: Pythonのパッケージマネージャーpipを使ってインストールできます。(安定版がインストールされます)
pip install sqlmap
- tarball/zipballをダウンロード: 公式サイトやGitHub Releasesからダウンロードして展開します。
インストール後、sqlmap --version
や sqlmapapi.py --help
を実行して、正しくインストールされているか確認しましょう。sqlmapapi.py
は通常、sqlmapのインストールディレクトリ内にあります。
必要な知識
sqlmapapiを効果的に利用するためには、以下の知識があると役立ちます。
- 基本的なコマンドライン操作
- HTTPプロトコル (GET, POSTリクエストなど)
- JSON形式のデータ構造
- REST APIの概念
- (オプション) curlコマンドやPython (requestsライブラリなど) を使ったHTTPリクエストの送信方法
- SQLインジェクションの基本的な知識とsqlmapの基本的な使い方
sqlmapapiサーバーの起動 🟢
sqlmapapiを利用するには、まずサーバーモードで sqlmapapi.py
を起動する必要があります。基本的な起動コマンドは以下の通りです。
python sqlmapapi.py -s
これを実行すると、デフォルトでは 127.0.0.1
(localhost) のポート 8775
でAPIサーバーが起動します。
[INFO] Running REST-JSON API server at '127.0.0.1:8775'..
[INFO] Admin ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (毎回変わる可能性があります)
[INFO] IPC database: '/tmp/sqlmapipc-xxxxxxxx.db'
[INFO] REST-JSON API server connected to IPC database
[INFO] Using adapter 'wsgiref' to run bottle.
この状態では、同じマシンからのみAPIにアクセスできます。他のマシンからアクセスを許可したい場合は、ホストアドレスを指定する必要があります。
python sqlmapapi.py -s -H 0.0.0.0
-H 0.0.0.0
を指定すると、サーバーが稼働しているマシンの全てのネットワークインターフェースでリクエストを受け付けるようになります。ポート番号を変更したい場合は -p
オプションを使用します。
python sqlmapapi.py -s -H 0.0.0.0 -p 9090
これで、0.0.0.0
のポート 9090
でAPIサーバーが起動します。
主な起動オプション
オプション | 説明 | デフォルト値 |
---|---|---|
-s , --server |
REST-JSON APIサーバーとして実行します。 | (指定必須) |
-c , --client |
REST-JSON APIクライアントとして実行します。 | (サーバーモードと排他) |
-H HOST , --host=HOST |
APIサーバーがリッスンするホストアドレスを指定します。0.0.0.0 を指定すると外部からのアクセスを許可します。 |
127.0.0.1 |
-p PORT , --port=PORT |
APIサーバーがリッスンするポート番号を指定します。 | 8775 |
--adapter=ADAPTER |
使用するサーバーアダプター (Bottleフレームワーク用) を指定します。 | wsgiref |
--username=USERNAME |
Basic認証のユーザー名を指定します (オプション)。 | なし |
--password=PASSWORD |
Basic認証のパスワードを指定します (オプション)。 | なし |
セキュリティのため、公開ネットワーク上でAPIサーバーを認証なしで公開することは避けるべきです。必要に応じて --username
と --password
でBasic認証を設定するか、ファイアウォールでアクセス制御を行ってください。
APIエンドポイントの概要 🧭
sqlmapapiサーバーが起動したら、HTTPリクエストを送信してsqlmapの機能を操作できます。主要なAPIエンドポイントとその機能を以下に示します。エンドポイントの詳細な仕様は、sqlmapのソースコード内の sqlmapapi.yaml
ファイルで確認できます。
ベースURLは、サーバーを起動したホストとポートになります (例: http://127.0.0.1:8775
)。
タスク管理 (Task Management)
-
GET /task/new
- 機能: 新しいスキャンタスクを作成し、一意のタスクID (
taskid
) を返します。 - レスポンス例:
{"success": true, "taskid": "xxxxxxxxxxxxxxxx"}
- 機能: 新しいスキャンタスクを作成し、一意のタスクID (
-
GET /task/{taskid}/delete
- 機能: 指定されたタスクIDのタスクと関連データを削除します。
- レスポンス例:
{"success": true}
スキャン管理 (Scan Management)
-
POST /scan/{taskid}/start
- 機能: 指定されたタスクIDのスキャンを開始します。リクエストボディにJSON形式でsqlmapのオプション (ターゲットURL、パラメータ、レベル、リスクなど) を指定します。
- リクエストボディ例:
{"url": "http://testphp.vulnweb.com/listproducts.php?cat=1", "level": 3, "risk": 2, "dbs": true}
- レスポンス例:
{"success": true, "engineid": 12345}
(engineid
はスキャンプロセスID)
-
GET /scan/{taskid}/status
- 機能: 指定されたタスクIDのスキャンの現在の状態 (
running
またはterminated
) とリターンコードを返します。 - レスポンス例 (実行中):
{"status": "running", "returncode": null}
- レスポンス例 (完了):
{"status": "terminated", "returncode": 0}
- 機能: 指定されたタスクIDのスキャンの現在の状態 (
-
GET /scan/{taskid}/data
- 機能: 指定されたタスクIDのスキャン結果 (検出された脆弱性、取得したデータなど) をJSON形式で返します。
- レスポンス例 (抜粋):
{"data": [{"status": 1, "type": 1, "value": [...]}], "success": true}
-
GET /scan/{taskid}/log
- 機能: 指定されたタスクIDのスキャンのログメッセージをJSON形式で返します。
- レスポンス例 (抜粋):
{"log": [{"time": "...", "level": "INFO", "message": "..."}, ...], "success": true}
-
GET /scan/{taskid}/stop
- 機能: 指定されたタスクIDの実行中のスキャンを停止します。
- レスポンス例:
{"success": true}
-
GET /scan/{taskid}/kill
- 機能: 指定されたタスクIDの実行中のスキャンプロセスを強制終了します。
- レスポンス例:
{"success": true}
オプション設定 (Option Setting)
-
GET /option/{taskid}/list
- 機能: 指定されたタスクIDに設定されているsqlmapオプションの一覧を返します。
-
POST /option/{taskid}/set
- 機能: 指定されたタスクIDにsqlmapオプションを設定します。リクエストボディにJSON形式でオプション名をキー、値をバリューとして指定します。
/scan/{taskid}/start
でもオプションは設定できますが、事前に設定しておくことも可能です。 - リクエストボディ例:
{"level": 5, "risk": 3}
- 機能: 指定されたタスクIDにsqlmapオプションを設定します。リクエストボディにJSON形式でオプション名をキー、値をバリューとして指定します。
-
GET /option/{taskid}/get
- 機能: 指定されたタスクIDの特定のオプションの値を取得します。クエリパラメータでオプション名を指定します (例:
/option/{taskid}/get?option=url
)。
- 機能: 指定されたタスクIDの特定のオプションの値を取得します。クエリパラメータでオプション名を指定します (例:
これらのエンドポイントを組み合わせることで、スキャンのライフサイクル全体(タスク作成 → オプション設定 → スキャン開始 → 状態確認 → 結果取得 → タスク削除)をプログラムから制御できます。
sqlmapapiの利用例 (curlを使用) 📝
ここでは、コマンドラインツールの curl
を使って、sqlmapapiを操作する基本的な流れを示します。APIサーバーが http://127.0.0.1:8775
で起動していると仮定します。
-
ステップ1: 新しいタスクを作成する
まず、新しいスキャンタスクを作成し、そのタスクIDを取得します。
curl http://127.0.0.1:8775/task/new
次のようなレスポンスが返ってきます。
taskid
の値を控えておきます。{ "success": true, "taskid": "a1b2c3d4e5f6a7b8" }
以降、この
taskid
(例:a1b2c3d4e5f6a7b8
) を使って操作します。 -
ステップ2: スキャンを開始する (オプション指定)
次に、ターゲットURLやその他のsqlmapオプションを指定してスキャンを開始します。ここでは例として、テスト用サイトのURLを指定し、データベース名を取得するオプション (
--dbs
) を有効にします。curl -H "Content-Type: application/json" -X POST -d '{"url": "http://testphp.vulnweb.com/listproducts.php?cat=1", "dbs": true}' http://127.0.0.1:8775/scan/a1b2c3d4e5f6a7b8/start
注意点:
-H "Content-Type: application/json"
でリクエストボディがJSON形式であることを明示します。-X POST
でPOSTメソッドを指定します。-d '{...}'
でJSON形式のオプションデータを送信します。url
は必須オプションです。/scan/{taskid}/start
の{taskid}
部分はステップ1で取得したものに置き換えます。
成功すると、スキャンが開始されたことを示すレスポンスが返ります。
{ "success": true, "engineid": 54321 }
-
ステップ3: スキャンの状態を確認する
スキャンが完了したか定期的に確認します。
curl http://127.0.0.1:8775/scan/a1b2c3d4e5f6a7b8/status
実行中の場合は以下のようなレスポンスが返ります。
{ "status": "running", "returncode": null }
完了した場合は以下のようになります。
{ "status": "terminated", "returncode": 0 }
status
がterminated
になるまで、適宜間隔をあけて確認します。 -
ステップ4: スキャン結果を取得する
スキャンが完了したら、結果を取得します。
curl http://127.0.0.1:8775/scan/a1b2c3d4e5f6a7b8/data
スキャン内容(ここでは
--dbs
)に応じた結果がJSON形式で返されます。{ "data": [ { "status": 1, "type": 5, "value": [ "information_schema", "acuart", "mysql" ] } // 他の検出結果も含まれる場合がある ], "success": true }
この例では、検出されたデータベース名のリスト (
acuart
,information_schema
,mysql
) がvalue
に含まれています。必要に応じて、ログも確認できます。
curl http://127.0.0.1:8775/scan/a1b2c3d4e5f6a7b8/log
-
ステップ5: タスクを削除する
スキャンが完了し、結果を取得したら、不要になったタスクを削除してリソースを解放します。
curl http://127.0.0.1:8775/task/a1b2c3d4e5f6a7b8/delete
成功すると以下のレスポンスが返ります。
{ "success": true }
以上が、curl
を使用したsqlmapapiの基本的な操作フローです。Pythonの requests
ライブラリなどを使えば、より複雑な自動化処理を実装することも可能です。
sqlmapapiクライアントモード (対話型) 🗣️
sqlmapapi.py
は、サーバーに接続して対話的にコマンドを実行するためのクライアントモードも提供しています。これは、APIの動作をテストしたり、手動で簡単な操作を行ったりするのに便利です。
クライアントモードで起動するには、-c
オプションを使用します。APIサーバーが 127.0.0.1:8775
で動作している場合、以下のコマンドを実行します。
python sqlmapapi.py -c -H 127.0.0.1 -p 8775
もしくは、サーバーがデフォルトのホスト・ポートで起動している場合は、ホストとポートの指定は省略できます。
python sqlmapapi.py -c
実行すると、以下のようなプロンプトが表示され、コマンドを入力できるようになります。
sqlmap REST-JSON API client $Revision: 1 $
* Connected to server 'http://127.0.0.1:8775' *
sqlmapapi>
プロンプトで help
または ?
を入力すると、利用可能なコマンドの一覧が表示されます。
sqlmapapi> help
Documented commands (type help <topic>):
========================================
data delete exit flush help kill list log new option scan status stop
Undocumented commands:
======================
?
sqlmapapi>
これらのコマンドは、基本的に前述のAPIエンドポイントに対応しています。例えば、新しいタスクを作成し、スキャンを開始するには以下のように入力します。
sqlmapapi> new -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
[INFO] created new task ID: b9c8d7e6f5a4b3c2
[INFO] starting scan for task ID: b9c8d7e6f5a4b3c2
[INFO] scan started
sqlmapapi>
このコマンドは、内部的に /task/new
と /scan/{taskid}/start
を呼び出しています。new
コマンドにsqlmapのオプション (-u
, --dbs
など) を直接渡すことができます。
スキャンの状態を確認するには status
コマンド、結果を取得するには data
コマンド、ログを見るには log
コマンドを使用します。(これらのコマンドは、最後に作成または選択されたタスクIDに対して動作します。)
sqlmapapi> status b9c8d7e6f5a4b3c2
[INFO] status: terminated
sqlmapapi> data b9c8d7e6f5a4b3c2
[INFO] scan data:
[
{
"status": 1,
"type": 5,
"value": [
"information_schema",
"acuart",
"mysql"
]
}
]
sqlmapapi> delete b9c8d7e6f5a4b3c2
[INFO] task 'b9c8d7e6f5a4b3c2' deleted
[+] deleted task ID: b9c8d7e6f5a4b3c2
sqlmapapi>
クライアントモードを終了するには exit
と入力します。
クライアントモードは、APIの挙動を理解したり、簡単なテストを行うには手軽ですが、複雑な自動化や他のツールとの連携には、直接HTTPリクエストを送信する方法(例: curlやスクリプト言語)の方が適しています。
セキュリティに関する注意点 ⚠️
sqlmapおよびsqlmapapiは、非常に強力なツールであり、Webアプリケーションの脆弱性を検出・悪用するために設計されています。そのため、その使用には細心の注意が必要です。
sqlmapapiを運用する上での具体的な注意点は以下の通りです。
-
アクセス制御: APIサーバー (
sqlmapapi.py -s
) を-H 0.0.0.0
で起動する場合、ネットワーク上の誰からでもアクセス可能になる可能性があります。信頼できないネットワークで実行する場合は、必ずファイアウォール等でアクセス元IPアドレスを制限するか、--username
と--password
オプションを使用してBasic認証を設定してください。🔐 - 情報漏洩リスク: API経由でスキャンを実行すると、スキャン対象のURL、パラメータ、検出された脆弱性情報、取得データなどがAPIサーバーのログやIPCデータベース (一時ファイル) に記録される可能性があります。サーバーのアクセス管理やログ管理を適切に行い、機密情報が漏洩しないように注意が必要です。
- リソース消費: sqlmapのスキャンは、対象サーバーおよびsqlmapapiサーバー自身のリソース(CPU、メモリ、ネットワーク帯域)を消費します。特に大規模なスキャンや多数の同時スキャンを行う場合は、リソース監視が重要です。DoS攻撃とならないよう、スキャンレベルやスレッド数などを適切に調整してください。
- 意図しないスキャンの実行: APIが外部に公開されている場合、悪意のある第三者によって意図しないターゲットに対してスキャンが実行されるリスクがあります。適切な認証とアクセス制御が不可欠です。
これらのリスクを理解し、適切なセキュリティ対策を講じた上でsqlmapapiを利用するようにしてください。
まとめ ✨
sqlmapapiは、強力なSQLインジェクションツールであるsqlmapの機能をRESTful API経由で利用可能にする便利なコンポーネントです。これにより、スキャンの自動化、他のツールとの連携、リモートでの実行管理などが容易になります。
この記事では、sqlmapapiの基本的な概念、サーバーの起動方法、主要なAPIエンドポイント、curlやクライアントモードを使った利用例、そしてセキュリティ上の注意点について解説しました。
sqlmapapiを適切に活用することで、Webアプリケーションのセキュリティテストプロセスをより効率的かつ体系的に進めることができます。ただし、その強力さゆえに、常に倫理的な利用と適切なセキュリティ対策を心がけることが重要です。✅
是非、テスト環境などで実際に試してみて、その便利さを体験してみてください!🚀
参考情報
- sqlmap 公式サイト: https://sqlmap.org/
- sqlmap GitHub リポジトリ (Wiki含む): https://github.com/sqlmapproject/sqlmap/wiki
- Kali Linux Tools – sqlmap: https://www.kali.org/tools/sqlmap/
コメント