SQLインジェクションの脆弱性が存在する兆候がある場合、sqlmapを使うことがあります。
ただし、脆弱性を報告する予定で既にSQLインジェクションを確認できているのであればsqlmapは使わない方が無難です。
というのも、SQLインジェクションの脆弱性が存在することを確認できているにも関わらずsqlmapでデータベースをダンプするなど情報漏洩につながる行為をすると敵対行為と見なされる場合があるためです。
トラブルを避けるためにも必要以上の攻撃は避けた方が無難です。
sqlmapとは?
sqlmapは、SQLインジェクションの脆弱性を自動検出・検証できるオープンソースツールです。
脆弱なWebアプリケーションを安全な環境でテストするために使用され、次のような用途で利用されます。
- セキュリティテストや脆弱性診断の自動化
- ペネトレーションテスト(許可された範囲内)
- CTF(Capture The Flag)や教育環境での学習
sqlmapの基本的な使い方
URLを指定して実行する
最低限必要なのはURLを指定する-uオプションです。
sqlmap -u "https://example.com/login.php?id=x"
POSTメソッドの場合は--dataオプションでデータを指定します。
sqlmap -u https://example.com/login.php --data="id=x"
POSTパラメータを指定することで、ログインフォームやAPIエンドポイントの検証も可能になります。
SQLインジェクションを検出できない場合はlevelとriskを調整して更に詳しく調査を進めることができます。
levelオプション(テスト範囲を広げる)
--level は検査対象をどの範囲まで拡張するかを指定します。初期値は 1、最大値は 5 です。
leve 2からCookieヘッダーがテストに追加され、level 3ではユーザーエージェントやリファラがテストに追加されます。level 5は最も高いレベルでHostヘッダーをテストに追加します。
| level | 内容 |
|---|---|
| 1 | 基本的なパラメータのみ |
| 2 | Cookieヘッダーも対象に含める |
| 3 | User-Agent, Referer も対象 |
| 4 | ペイロードパターンを増やす |
| 5 | Hostヘッダーまで含む最大テスト範囲 |
脆弱性の有無を確認する場合はlevel 5でチェックすることをおすすめします。
sqlmap -u https://example.com/login.php --data="user=x&password=y" --level=5
riskオプション(テストの危険度)
--risk はSQL実行時の影響範囲を制御します。初期値は 1、最大値は 3 です。
risk 1はデータベースに影響を与えません。risk 2は大量のクエリ時間ベースの SQL インジェクションテストが追加されます。risk 3はORベースの SQL インジェクション テストが追加されます。
| risk | 安全性 | 概要 |
|---|---|---|
| 1 | 読み取り専用のクエリ | |
| 2 | 時間ベースのテストを追加 | |
| 3 | ORベースなど高リスクなテストを実施(※破壊の恐れあり) |
risk 3はWEBアプリケーションのSQL文によりますがテーブルを破壊してしまう場合があるため、細心の注意が必要です。
sqlmap -u https://example.com/login.php --data="user=x&password=y" --level=5 --risk=3
データベース情報の列挙とダンプ
脆弱性が確認できた後に行う調査ステップです。
データベース名を列挙する
--dbsオプションでデータベース名を列挙します。
sqlmap -u https://example.com/login.php --data="user=x&password=y" --dbs
デーブル一覧を列挙する
データベース名を列挙できたら--tablesオプションでデータベースのテーブルを列挙します。データベース名は-Dオプションで指定します。
sqlmap -u https://example.com/login.php --data="user=x&password=y" -D users --tables
ダンプ(データ取得)する
データベースをダンプしたい場合は--dumpオプションを使いますが、本当にこのオプションを使ってデータベースをダンプする必要があるのか検討してください。冒頭に書いたようにバグ報告する場合は必要以上の攻撃は避けた方が無難です。
データベースとテーブルを指定してダンプする場合は-Dオプションでデータベース名を指定し-Tオプションでテーブル名を指定します。
sqlmap -u https://example.com/login.php --data="user=x&password=y" -D users -T login --dump
アクセス可能なすべてのデータベースをダンプしたい場合はデータベース名とテーブル名を指定せずに実行します。
sqlmap -u https://example.com/login.php --data="user=x&password=y" --dump
パフォーマンス調整:スレッド数
--threads でスレッド数を増やすと高速化が可能です(最大10)。
sqlmap -u https://example.com/login.php --data="user=x&password=y" --dump --threads=10
ただし、環境によっては過負荷や接続不安定を引き起こすため、5〜7程度がおすすめです。
テクニックオプション:--technique
--technique ではSQLインジェクション手法を限定できます。
| 記号 | テクニック | 内容 |
|---|---|---|
| B | Boolean-based blind | 真偽判定方式 |
| E | Error-based | エラー出力利用 |
| U | Union query-based | UNION句利用 |
| S | Stacked queries | 複数クエリ実行 |
| T | Time-based blind | 時間差方式 |
| Q | Inline queries | サブクエリ注入 |
sqlmapは6つのテクニックを使ってSQLインジェクションのテストを実行しますが、どのテクニックを使うのか指定することもできます。
テクニックオプションの初期値は--technique=BEUSTQです。
通信環境が不安定な場合や時間を節約したい場合は「T」を外してTime-based blindをスキップさせる、といったことができます。
例:Time-based blind を除外する場合
sqlmap -u https://example.com/login.php --data="user=x&password=y" --technique=BEUSQ
ファイルダウンロード
バックエンド データベース管理システムが MySQL、PostgreSQL、または Microsoft SQL Server である場合、権限が許す範囲内でファイルをダウンロードできます。ファイルはテキストベースでもバイナリベースでも問題ありません。
sqlmap -u https://example.com/login.php --data="user=x&password=y" --file-read=/etc/passwd
HTTPリクエストをファイルから読み込む
複雑なリクエストはBurp Suiteなどでリクエストをファイルに保存して指定できます。
- Burp Suite → Request画面で「Copy to file」
- 保存したリクエストを
-rオプションで指定
リクエストをファイルに保存するには以下のスクリーンショットのようにBurp SuiteのRequestの画面で右クリックし「Copy to file」でHTTPリクエストをファイルに保存します。

保存したファイルを-rオプションで読み込みます。
sqlmap -r login.req
これによりCookieや複雑なPOSTデータも正確に再現できます。
- 実験・教育目的に限定する
- ダンプは「確認済み脆弱性」への再攻撃と誤解されやすい
- 常に対象システムの許可を取得してから実施する
- 実施記録を残して後で報告できるようにしておく
よくある質問(FAQ)
まとめ
sqlmapはSQLインジェクション検証を自動化できる強力なツールです。
しかしsqlmapは武器にもなるため、--level と --risk の使い方を理解して安全にテストすることが重要です。
実施は検証環境限定・許可取得後に行うこと。正しく使えば、セキュリティ教育や防御強化に欠かせない学習ツールになります。

コメント