请求方式 — 考点精讲

前置知识:HTTP 协议基础 — 先了解 HTTP 协议基础再来看本考点

原理精讲 — HTTP 方法是什么?为什么可以自定义?

请求报文的第一行就是方法

客户端发给服务器的 HTTP 请求,本质是一段纯文本

CTFHUB /index.php HTTP/1.1 <- 请求行: [方法] [路径] [HTTP版本]
Host: www.example.com <- 请求头
User-Agent: Mozilla/5.0
Cookie: session=abc123
 <- 空行(分隔头部和正文)
body=value <- 请求体(GET 请求没有)

关键在第一行(请求行)的第一个单词——方法(Method)

方法名只是一个 token,不是硬性限制

RFC 7231 对方法的定义是:

方法是一个 token,请求的目的是指示服务器对目标资源执行什么操作。

协议规范只定义了 GET/POST/PUT/DELETE 等标准方法,但没有限制你只能用这些。服务器端通过读取请求行第一个单词来判断方法,然后交给应用程序代码处理。所以发一个 CTFHUB /index.php HTTP/1.1,服务器看到的就是”请求方法等于 CTFHUB”。

服务器端伪代码:

$method = $_SERVER['REQUEST_METHOD']; // 取请求行第一个单词
if ($method === "CTFHUB") {
 echo $flag;
} else {
 echo "请使用CTFHUB方法访问";
}

同一个考点在真实场景

自定义方法本身不是漏洞——是服务器把方法名当成身份判断/权限判断的依据才是。真实世界中:某些网关/WAF 只检查 GET/POST 而放行未知方法;某些 API 用方法名做路由鉴权。CTF 里最常见的形态就是”用非标准方法访问就给你 flag”。

注意事项

易错点说明
方法区分大小写CTFHUBctfhub,服务器做精确比较时大小写错就失败
用 curl 发自定义方法curl -X CTFHUB 目标/index.php-X 指定任意方法)
用 Burp 发自定义方法Repeater 里直接改请求行第一行,不要用下拉菜单
404 还是 405报 “HTTP Method Not Allowed” 时记得请求 index.php(提示里常写明)
方法名拼错提示是 CTF**B,中间的星号就是 HU,照抄全名

题目解法

CTFHub 技能树位置:CTFHub → Web → Web 前置技能 → HTTP 协议 → 请求方式

解法(curl 终端):

# 1. 先看页面提示(通常写着 Use CTF**B Method, I will give you flag)
curl -s http://目标/
 
# 2. 用题目要求的方法请求 index.php
curl -X CTFHUB -v http://目标/index.php
# 响应体里就是 flag

解法(Burp / 浏览器 F12):

  1. 打开页面 → F12 Network 或 Burp 抓包
  2. 找到请求,把请求行 GET /index.php HTTP/1.1 改成 CTFHUB /index.php HTTP/1.1
  3. 重放,响应里拿到 flag

同类变式(请求头伪造家族)

考点尝试
自定义方法(本题)curl -X CTFHUB
Host 头curl -H "Host: 特定值"
User-Agentcurl -A "某浏览器"
Referercurl -e "期望来源"
X-Forwarded-Forcurl -H "X-Forwarded-For: 127.0.0.1"(伪造 IP)
Content-Typecurl -H "Content-Type: application/json"

核心知识点总结

概念说明
请求行[方法] [路径] [HTTP版本],方法是最左边的 token
方法本质字符串标识,协议不限制只能用标准方法
服务器处理读请求行第一个单词做判断,与协议规范无关
curl -X指定任意请求方法
方法大小写敏感,照抄提示原文
防御角度不要用方法名做唯一鉴权依据

关联教程