WriteUp: picoCTF 2023 - More SQLi
はじめに
こんにちは。CTF初心者のロイといいます。
今回はpicoCTFのMore SQLi(Medium, Web Exploitation)を解いたので、WriteUpを残しておきます。
解法だけでなく、なるべく思考の過程を残したいと思っていますので、ご参考になれば幸いです。
問題概要
Descriptionによると「このWebサイト上でFlagをみつけられるかな?」といった感じです。
challenge instanceを立ち上げて、リンクをブラウザで開いてみると、こんな感じです。
SQLインジェクションを使うのはわかりますが、どう攻めましょうか。
まずはなんか入れてみる
まずはなんか入れてボタン押してみるしかないか。
Usernameにhoge、Passwordにhugaを入れてLog inボタンを押してみる。
すると、以下のような画面が表示されました。

ご丁寧にSQLクエリが表示されました。
SQLインジェクションとは?
SQLインジェクションとは、SQL文を操作してデータベースに不正なクエリを実行させて、データを抜き取る攻撃です。
さきほどのSQLクエリをみたところ、下記のSQLインジェクションの例でよくみるやーつが使えそうですね。
' OR '1'='1' --
これをPasswordに入れたら、SQLクエリが下記ようになるはず。
SELECT id FROM users WHERE password = '' OR '1'='1' -- ' AND username = 'hoge'
実際にやってみると、SQLが正常に実行され、ログインできてしまいました。

これでSQLインジェクションによるログインは成功しました。
ヒントのSQLiLiteとは?
ログインはできましたが、flagは一体どこに?
ヒントのSQLiteについて調べます。
軽量でファイル形式であるのが特徴、標準のSQLが使える、データ型の指定が不要。。。
あんまりピンと来ないですねぇ。
データベースってスキーマやデータベース自体の情報を持った内部テーブルというのがあるはずなので、それを調べます。
SQLiteの内部テーブルは、sqlite_masterという名前で、スキーマやテーブルの情報が格納されているそうです。
CREATE TABLE sqlite_master(
type text,
name text,
tbl_name text,
rootpage integer,
sql text
);
どうにかして、sqlite_masterテーブルを参照できないか。
さきほどのSQLクエリをみると、SELECT文が使われているので、UNION SELECTを使って、sqlite_masterを参照できるかもしれません。
試しに、入力欄に以下のように入れて、Searchボタンを押してみます。
' UNION SELECT * FROM sqlite_master --
下記の画面のように、なにもとれません。。。

よく画面をみると、City, Address, Phoneと3つのカラムなので、*ではなく3つカラムを指定しなきゃダメでした。(*だとsqlite_tableの全5カラム取ってきてUNIONできない)
こんな感じ
' UNION SELECT name, sql, tbl_name FROM sqlite_master --
すると、以下のような画面が表示されました。

hintsテーブル、more_tableテーブルなどなど、各テーブルのCREATE文がみれましたね~。
flagを取得する
次は、flagが格納されているテーブルを探します。
さきほどの画面をみると、more_tableテーブルにflagカラムがあるようです。
では、more_tableテーブルのflagカラムを参照してみます。
' UNION SELECT 1, id, flag FROM more_table --
こちらを入力欄に入れて、Searchボタンを押します。
すると、以下のような画面が表示されました。

flagが表示されました!