sqlmapapi の使い方解説 🚀

セキュリティツール

Webアプリケーションのセキュリティテストにおいて、SQLインジェクションは非常に重要な脆弱性の一つです。この脆弱性を効率的に検出し、悪用するための強力なツールとして sqlmap が広く知られています。 sqlmapは非常に高機能ですが、コマンドラインでの操作が基本となるため、自動化や他のツールとの連携には一手間かかる場合があります。

そこで登場するのが sqlmapapi です。sqlmapapiは、sqlmapの機能をRESTful JSON APIサーバーとして公開するコンポーネントです。これにより、HTTPリクエストを通じてsqlmapの機能をプログラムから制御したり、複数のメンバーで共有したり、CI/CDパイプラインに組み込んだりすることが可能になります。 この記事では、sqlmapapiの基本的な使い方から、具体的なAPIエンドポイントの利用方法、そしてその利点と注意点について詳しく解説していきます。💪

🎯 対象読者

  • Webアプリケーションのセキュリティ担当者
  • ペネトレーションテスター
  • セキュリティに関心のある開発者
  • sqlmapの自動化や連携に関心のある方

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.pypython sqlmapapi.py を実行します。
  • pipでインストール: Pythonのパッケージマネージャーpipを使ってインストールできます。(安定版がインストールされます)
    pip install sqlmap
  • tarball/zipballをダウンロード: 公式サイトGitHub Releasesからダウンロードして展開します。

インストール後、sqlmap --versionsqlmapapi.py --help を実行して、正しくインストールされているか確認しましょう。sqlmapapi.py は通常、sqlmapのインストールディレクトリ内にあります。

必要な知識

sqlmapapiを効果的に利用するためには、以下の知識があると役立ちます。

  • 基本的なコマンドライン操作
  • HTTPプロトコル (GET, POSTリクエストなど)
  • JSON形式のデータ構造
  • REST APIの概念
  • (オプション) curlコマンドやPython (requestsライブラリなど) を使ったHTTPリクエストの送信方法
  • SQLインジェクションの基本的な知識とsqlmapの基本的な使い方

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認証を設定するか、ファイアウォールでアクセス制御を行ってください。

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"}
  • 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}
  • 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}
  • GET /option/{taskid}/get
    • 機能: 指定されたタスクIDの特定のオプションの値を取得します。クエリパラメータでオプション名を指定します (例: /option/{taskid}/get?option=url)。

これらのエンドポイントを組み合わせることで、スキャンのライフサイクル全体(タスク作成 → オプション設定 → スキャン開始 → 状態確認 → 結果取得 → タスク削除)をプログラムから制御できます。

ここでは、コマンドラインツールの curl を使って、sqlmapapiを操作する基本的な流れを示します。APIサーバーが http://127.0.0.1:8775 で起動していると仮定します。

  1. ステップ1: 新しいタスクを作成する

    まず、新しいスキャンタスクを作成し、そのタスクIDを取得します。

    curl http://127.0.0.1:8775/task/new

    次のようなレスポンスが返ってきます。taskid の値を控えておきます。

    {
      "success": true,
      "taskid": "a1b2c3d4e5f6a7b8"
    }

    以降、この taskid (例: a1b2c3d4e5f6a7b8) を使って操作します。

  2. ステップ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. ステップ3: スキャンの状態を確認する

    スキャンが完了したか定期的に確認します。

    curl http://127.0.0.1:8775/scan/a1b2c3d4e5f6a7b8/status

    実行中の場合は以下のようなレスポンスが返ります。

    {
      "status": "running",
      "returncode": null
    }

    完了した場合は以下のようになります。

    {
      "status": "terminated",
      "returncode": 0
    }

    statusterminated になるまで、適宜間隔をあけて確認します。

  4. ステップ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. ステップ5: タスクを削除する

    スキャンが完了し、結果を取得したら、不要になったタスクを削除してリソースを解放します。

    curl http://127.0.0.1:8775/task/a1b2c3d4e5f6a7b8/delete

    成功すると以下のレスポンスが返ります。

    {
      "success": true
    }

以上が、curl を使用したsqlmapapiの基本的な操作フローです。Pythonの requests ライブラリなどを使えば、より複雑な自動化処理を実装することも可能です。

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アプリケーションの脆弱性を検出・悪用するために設計されています。そのため、その使用には細心の注意が必要です。

重要: 倫理的な利用

sqlmapおよびsqlmapapiは、必ず自身が管理している、または明示的にテスト許可を得ているシステムに対してのみ使用してください。 許可なく他者のシステムに対して使用することは、法律で禁止されており、深刻な結果を招く可能性があります。倫理的な利用を心がけ、責任ある行動をとってください。🚫

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アプリケーションのセキュリティテストプロセスをより効率的かつ体系的に進めることができます。ただし、その強力さゆえに、常に倫理的な利用と適切なセキュリティ対策を心がけることが重要です。✅

是非、テスト環境などで実際に試してみて、その便利さを体験してみてください!🚀

参考情報

コメント

タイトルとURLをコピーしました