题目来源:0xGame 公开赛事 Web 签到题(官方授权靶场环境)
学习目标:理解一个 HTTP 请求由哪些部分组成,各字段如何在服务端被读取和判断
适合人群:CTF 新手、第一次用 curl 手动发请求的同学

⚠️ 本文所有操作仅在赛事官方分配的、临时的练习靶机上进行,不涉及任何真实系统。学习目的是理解 HTTP 协议,请勿将文中方法用于未授权的任何目标。


一、题目长什么样

打开靶机地址,页面上只有几行大字:

题目页面

Yakit && BurpSuite && HackBar 你自己选一个玩吧
或者你也可以选择其他的方法
Tech Otakus Save The World

页面最底下有一行小字提示:“用GET传递 hello=web”。

没有按钮、没有输入框——它在告诉你:这道题不用点鼠标,直接手动构造一个 HTTP 请求就行。题目推荐的工具是 Yakit / BurpSuite / HackBar,但我们用 Windows 自带的 curl.exe 就能完成,零安装。


二、先搞懂 HTTP 请求的基本结构

发请求就像寄快递,包裹里分三层:

  1. 请求行:你要做什么(GET 还是 POST)、寄到哪个路径
  2. 请求头(Headers):一堆面单上的附加信息,比如"我是谁"“我从哪来”“带着什么小纸条”
  3. 请求体(Body):POST 时放在包裹里的货

服务器收到后,按面单上写的内容逐条判断,全部答对才给你 flag。

本题会用到的几个字段

字段在请求的哪一层通俗理解
?hello=web请求行 URL 里GET 方式带的参数
http=good请求体 Body 里POST 方式交的数据
Cookie: Sean=god请求头服务端和你约定的小纸条
User-Agent请求头你用的客户端标识
Referer请求头你是从哪个页面跳过来的
Via请求头路由中转标记

三、逐步骤操作(命令逐字讲解)

环境:Windows 11,PowerShell,先 cd C:\Windows\System32(路径干净,截图不会暴露个人目录)。

💡 Windows PowerShell 里直接敲 curl 是另一个命令的别名,必须写 curl.exe 才是真正的 curl。

第 1 步:GET 传 hello=web

curl.exe "http://靶机地址/?hello=web"

服务器回:用POST传递 http=good。说明 GET 这步对了。

第 2 步:POST 传 http=good

注意 URL 里要保留 ?hello=web:

curl.exe -X POST "http://靶机地址/?hello=web" --data-urlencode "http=good"
  • -X POST:请求方法改为 POST
  • --data-urlencode "http=good":把数据放进请求体

服务器回:设置cookie Sean=god。

第 3 步:带上 Cookie

curl.exe -X POST "http://靶机地址/?hello=web" --data-urlencode "http=good" -H "Cookie: Sean=god"
  • -H 用来加一个请求头,这里加的是 Cookie。

服务器回:请使用Safari浏览器访问。

第 4 步:设置 User-Agent

这里有个新手很容易踩的坑:题目要的 UA 就写 Safari 这一个词就行,不用去网上抄一长串完整的浏览器标识。

curl.exe -X POST "http://靶机地址/?hello=web" --data-urlencode "http=good" -H "Cookie: Sean=god" -A "Safari"
  • -A 是设置 User-Agent 的简写。

服务器回:请从www.mihoyo.com访问本页面。(一个原神玩家才懂的小彩蛋)

第 5 步:设置 Referer

Referer 直接写域名,不要加 http://:

curl.exe -X POST "http://靶机地址/?hello=web" --data-urlencode "http=good" -H "Cookie: Sean=god" -A "Safari" -H "Referer: www.mihoyo.com"

服务器回:请使用clash这只猫猫来代理一下。

第 6 步:按提示设置 Via 头

题目提示"代理一下",那就按它说的加一个 Via 请求头,值照提示写:

curl.exe -X POST "http://靶机地址/?hello=web" --data-urlencode "http=good" -H "Cookie: Sean=god" -A "Safari" -H "Referer: www.mihoyo.com" -H "Via: clash"

四、成功拿到 flag

成功截图

0XGame{Congratuation_You_Are_Http_God!!!}

服务器还写了一句:“HTTP 协议的真理,你已解明!”

💡 靶机是临时容器,每次重启网址都会变,把命令里的"靶机地址"换成你当前分配的地址即可。


五、一张表总结整条请求

这道题服务端没有下发会话 Cookie,所以最后一条命令必须一次性把所有字段都带上:

字段值位置
hellowebURL 查询参数
httpgoodPOST 请求体
CookieSean=god请求头
User-AgentSafari请求头
Refererwww.mihoyo.com请求头
Viaclash请求头

最终命令(替换成自己的靶机地址):

curl.exe -X POST "http://你的靶机地址/?hello=web" --data-urlencode "http=good" -H "Cookie: Sean=god" -A "Safari" -H "Referer: www.mihoyo.com" -H "Via: clash"

六、服务端大概是怎么判断的

用伪代码帮你理解出题思路(这是本题最值得学的部分):

if ($_GET['hello']  !== 'web')  die('用GET传递 hello=web');
if ($_POST['http']  !== 'good') die('用POST传递 http=good');
if ($_COOKIE['Sean'] !== 'god') die('设置cookie Sean=god');
if ($_SERVER['HTTP_USER_AGENT'] !== 'Safari') die('请使用Safari浏览器访问');
if ($_SERVER['HTTP_REFERER']   !== 'www.mihoyo.com') die('请从www.mihoyo.com访问');
if ($_SERVER['HTTP_VIA']       !== 'clash') die('请按提示设置路由头');
echo $flag;

看明白没?它就是在逐一读取你请求里的各个字段,然后和期望值做字符串比较。这正是这道题的教学价值——让你亲手感受"请求头里的每一行,服务端都能拿到"。


七、新手常见问题

Q1:为什么我抄了一长串 Safari 的完整 UA 反而不行?
A:题目用的是字符串比较,它要的就是 Safari 这个短值。CTF 里遇到"请用某客户端",先试最短写法,别一上来就抄完整标识。

Q2:为什么 Referer 写 https://www.mihoyo.com/ 不行?
A:因为它只认 www.mihoyo.com 这串字。遇到这种精确匹配题,把协议头和末尾斜杠都去掉试试。

Q3:为什么浏览器地址栏改不了这些?
A:地址栏只能改 URL。Cookie、UA、Referer、Via 这些必须用 curl 或专用工具手动设置。

Q4:PowerShell 里 curl 和 curl.exe 区别?
A:PowerShell 的 curl 默认是 Invoke-WebRequest 的别名,参数不通用;要敲 curl.exe。


八、安全启示(蓝队视角)

这道题反过来也告诉我们一个重要原则:

客户端发来的任何请求头,都不能作为安全信任的依据。

User-Agent、Referer、Cookie、Via 这些字段,客户端想写什么就写什么,服务端不能拿它们来做身份校验或权限判断。真正可靠的会话状态,必须由服务端签发不可伪造的令牌,并在服务端校验。这也是学习 Web 安全时需要建立的基本认知。


九、总结

这道题本质上是一次"HTTP 请求结构解剖练习":

  • GET 参数在 URL 里
  • POST 参数在请求体里
  • Cookie、UA、Referer、Via 都在请求头里

每一步提示都对应一个可手动控制的字段,把它们逐一填对,就通关了。CTF 签到题的价值不在于"拿到 flag",而在于帮你建立"请求是可被完全构造的"这一认知,这是后续学习 Web 安全的地基。


版权与免责声明

  • 本文仅用于网络安全学习与 CTF 技术交流,靶机来源于 0xGame 公开赛事的官方临时练习环境。
  • 文中所有命令均在赛事官方分配的靶机上执行,不对任何真实系统进行测试。
  • 请勿将本文方法用于未经授权的任何目标;因不当使用造成的后果与作者无关。
  • 题目版权归 0xGame 赛事主办方所有,解题思路为个人学习记录,转载请注明出处。
Logo

更多推荐