問題名:More SQLi
この問題は今までのSQLiとは少し違ってとても興味深いと感じました。
ログイン
まず適当な文字を入れてログインしてみました。
Username:test
Password:test
そうすると何やら怪しい画面が出てきました。

ログインには失敗していそうですが、ログイン時のSQL文が表示されました!(脆弱性ですねW)
このSQL文をよく見てみると、なにやらいつもと文脈が違うようです。
passwordとusernameの位置が変わっており、usernameにスクリプトを打ってもログインできないようになっていました。
Username:test
Password:' or 1 = 1 --
passwordの方にスクリプトを打ち込んでログインしてみると、ログイン成功しました!!

データの取得
会社の場所やアドレス、電話番号を調べるサイトみたいですね。
入力欄にcityと書いてあるので都市名でデータをDB(データベース)から取得する仕組みっぽい…多分こんな感じのSQLが動いてそうです。
select city,Address,Phone from ? where city = city名
では、unionを使って表示するデータを上書きしたいと思います。
以下のSQL文を打ち込みます。
' union select * from users --
ユーザーのログインデータが格納してあるUsersテーブルを使って検証してみます。

adminのデータを取得することができました。
Usersテーブルにはフラグがなさそうですね。
ここでpicoCTFのヒントを見てみました。
ヒント:SQLiLite
ネット上で調べてみるとSQLiteにはsqlite_masterというSQLの構造を管理するシステムテーブルがあるそうです。
sqlite_masterテーブルを使ってみる。
' union select * from sqlite_master --

何も表示されませんでした、どこかが間違っていそうです。

' union select 1,1,1 from sqlite_master --
上のSQL文を打ち込むとデータが表示されました。
どうやらselectで表示するデータ数がかみ合っていなかったようです。
補足
select city,Address,Phone from ? where city = city名
太文字のところがサイトの入力欄と連携していて、そこにSQL文を入れているので繋げると以下のようなSQLが実行されている。
select city,Address,Phone from ? where city = city名' union select 1,1,1 from sqlite_master --
この時にunionで繋いだSQL文のselectで表示させるデータ数は同じにしなくてはならないので、*を使うとおかしなことになってしまうっぽいです。
sqliteのテーブルの列情報などをまとめているサイトのURLを張っておきます。
https://www.techonthenet.com/sqlite/sys_tables/index.php
上のリンク先に飛ぶとsqlite_masterにはsqlという列があり、オブジェクトを作るときに実行されたCREATE文などのSQLが格納されているらしいです。
これを使ってみましょう。
' union select 1,1,sql from sqlite_master --と打ち込むとテーブル情報が出力されました。

上から二番目のmore_tableにflagというデータがあることが分かります。
more_tableのflagとついてにidも見てみました。
' union select 1,id,flag from sqlite_master --
フラグが出てきましたね!

