关卡顺序如下(按题目要求):
/treasure?key=magic_word/guard/1337/guard/1337/../vault/vault?password=7777/claim?name=宝藏猎人 → 返回动态 flag以下示例将
IP:PORT替换为题目实际地址。
推荐使用curl -i观察返回内容(必要时也能看头信息)。
访问:
curl -s "http://IP:PORT/treasure?key=magic_word"
预期返回:
复制代码
第一关通过!线索:去问问1337号守卫
说明
这里考察 URL 参数:key=magic_word
如果 key 写错/缺失,会收到幽默错误提示(掉进数字沼泽)
✅ 第二关:访问指定路径
根据提示访问守卫 1337:
bash
复制代码
curl -s "http://IP:PORT/guard/1337"
预期返回:
bash
复制代码
第二关通过!我听说宝藏在../vault里
说明
这里考察 路径参数/路径片段:/guard/1337
线索中出现 ../vault,暗示下一关涉及 路径遍历
✅ 第三关:路径遍历(../)概念演示
按题面要求访问:
bash
复制代码
curl -s "http://IP:PORT/guard/1337/../vault"
预期返回:
ruby
复制代码
第三关通过!但金库需要密码:?password=数字
说明(关键点)
../ 表示“回到上一层目录”,是路径遍历最基础的符号
在很多 Web/文件系统路径解析中:
A/B/../C 会等价于 A/C
本题通过 URL 路径的方式让你直观理解 ../ 的含义
✅ 第四关:再次使用 URL 参数(密码)
根据提示访问金库并带上密码参数:
bash
复制代码
curl -s "http://IP:PORT/vault?password=7777"
预期返回:
pgsql
复制代码
最终挑战:告诉我你的名字?name=宝藏猎人
说明
这里再次考察 URL 参数
密码必须为 7777 才能继续
✅ 第五关:提交名字并领取宝藏(flag)
根据提示访问 /claim 并传入 name=bounty_hunter:
注意:如果用 curl,中文需要 URL 编码,最省事的写法是直接把整段 URL 放在引号里,让 shell 不乱解析。
bash
复制代码
curl -s "http://IP:PORT/claim?name=bounty_hunter"
预期返回:
直接输出 动态 flag(来自环境变量 GZCTF_FLAG)
四、一键通关命令(顺序执行)
bash
复制代码
curl -s "http://IP:PORT/treasure?key=magic_word"
curl -s "http://IP:PORT/guard/1337"
curl -s "http://IP:PORT/guard/1337/../vault"
curl -s "http://IP:PORT/vault?password=7777"
curl -s "http://IP:PORT/claim?name=%E5%AE%9D%E8%97%8F%E7%8C%8E%E4%BA%BA"
五、常见坑与排错
1)提示“掉进了数字沼泽”
说明你当前关卡条件不满足,常见原因:
参数拼错:如 magic_word、password=7777
路径打错:如 /guard/1337 少了数字
尝试跳关:未按顺序通过前面关卡(进度验证会拦住)
2)第三关 URL 被“自动规范化”
某些代理/网关可能会把 ../ 在到达应用前就归一化(例如直接变成 /guard/vault 或 /vault)。
如果遇到这种情况:
尝试用浏览器直接访问 /guard/1337/../vault
或使用不同客户端(curl / burp)再次请求
Content type
Image
Digest
sha256:d1de841bd…
Size
45.9 MB
Last updated
9 months ago
docker pull wjx4321/treasure