はじめに
まず、問題のページへ飛ぶ。
ラーメン美味しそう。そう、この問題は深夜に手を付けてはいけないので注意が必要。
サイトの観察
まずは、いろいろ触ってみる。そうすると以下のようなことがわかる。
- ラーメンが美味しそう。
- 検索画面があって、username で一言情報の絞り込みができる。
- 検索は部分一致
部分一致ができるということは、SQLのLIKE文を使っているということを踏まえてもっと触ると以下のことがわかる。
- ラーメンが美味しそう。
- 「%」で検索すると初期表示と一緒(全件表示)である。
- シングルクォート(「’」)を入れると、php の fetchAll() 関数でのエラーがでてくる。
ということで、これは SQLインジェクション問題という事を察することができる。
flagを探す
flag は、サーバ上のファイルとして置かれているか、データベース上にあると推測し、まずはデータベース上のデータを探す。また、サーバ上で実行されるSQLとして、次のようなSQLを想定した上でクエリを投げる。
SELECT username, comment FROM tbl WHERE username like '%(入力された文字)%'
使われている RDBMS は不明だが、製品はそう多くないので、まずはMySQLあたりを想定して、テーブル一覧の取得を試みる。
MySQL の場合、INFORMATION_SCHEMA というスキーマ内の各種テーブルから各種情報が取得できるので、次のような検索をする。
そうすることで、次の結果が得られる。
というわけで、「app.flag」と「app.members」の2つのテーブルがあることがわかったので、次は「flag」を取りに行く。
同様の手法で INFORMATION_SCHEMA.COLUMN からカラム名を確認しておく。
からの
ということで、app.flag.flag を取りに行けば良いことがわかる。
なので、次の内容を検索欄に入力し検索を行う。
' union all select flag,null from app.flag --
※fetchAll() は配列で返すので、2列必要なことに注意。
値は何でも良いが、今回はnullにしておく。
結果は下記
ということで、flagの「ctf4b{a_simple_sql_injection_with_union_select}」が、美味しそうなチャシュー及び卵の黄身の画像と一緒に取り出せる。
最後に
ラーメンは飲み物