Plaid CTF 2013: Web - charsheetを解いてみた
モチベーション
試しに1問CTFの問題を解いてみたい
記事概要
CTFについて調べたついでにPlaid CTF 2013のWeb系の問題を1問解いたので記録として残す。
解放メモ
search.phpにアクセスすると以下の様な画面が表示される。
①キャラクター検索フォームにてSQLiを実行
下記のSQLがサーバサイドで実行されていることがわかる。 また、ERRORの結果からLIKEの直後の%(ワイルドカード)部分に検索フォームに入れた値が入力されることがわかる。
SELECT c.id, c.name, DATE_FORMAT(c.lastedited, ‘%d %M %Y @ %H:%i’) as lastedited, c.owner, st.name as tname, ca.name as caname FROM sheet_templates st, characters c LEFT JOIN campaign ca on ca.id = c.campaign WHERE c.public = ‘y’ AND c.template_id = st.id AND UPPER(c.name) LIKE (‘%’) ORDER BY UPPER(c.name), UPPER(c.name) LIMIT 15
②コメントアウト付きのSQL文を入力フォームに挿入
') OR 1 = 1 --
できた!
感想&躓き
感想
- 何を出題者が求めているか(adminが作ったキャラクタname)を理解できれば簡単な問題。
- sqlmapとかDB解析ツールを利用してみるといいかも
躓き
- SQLでUPPERは文字列を大文字に変換の意味
- SQLでLIKEはWHERE(条件)のパターンマッチングに使用
- WHERE col_name LIKE pattern
- WHERE col_name NOT LIKE pattern
- %:任意の0文字以上の文字列
- 例) %java%: カラムの値にjavaが含まれる
- _:任意の1文字
- 例)___(アンスコ×3):3文字の任意の文字列
- 例)a__b:aで始まりbで終わる文字列
用語集:
特になし