请求方式 — 题目解法

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

题目描述

服务器要求使用 CTFHUB 请求方法来访问,用标准的 GET/POST 拿不到 flag。

解法 2:Burp Suite 图形化

步骤:

  1. 浏览器配置代理到 Burp(127.0.0.1:8080)
  2. 访问题目 URL,Burp 拦截到请求
  3. 在 Repeater 模块中,修改请求首行:
# 原始请求
GET /index.php HTTP/1.1

# 修改后
CTFHUB /index.php HTTP/1.1
  1. 点击 Send,响应中拿到 flag

注意:Burp 默认只显示 GET/POST 下拉菜单,直接在请求第一行手动修改即可。

原理精讲 — 为什么能这样做?

HTTP 请求报文结构

客户端向服务器发送的 HTTP 请求,本质上是这样一个纯文本

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

关键就在第一行(请求行)

[方法] [路径] [HTTP版本]

方法(Method) 是一个字符串标识,协议规范只定义了 GET/POST/PUT/DELETE 等标准方法,但没有限制你只能用这些

HTTP 协议为什么允许自定义方法?

RFC 7231 规定:

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

换句话说,方法名只是一个约定,而不是一个硬性限制。服务器端通过读取 HTTP 请求行的第一个单词来判断方法,然后执行对应的逻辑。

服务器端逻辑

题目服务器的伪代码大概是这样的:

$method = $_SERVER['REQUEST_METHOD'];  // 获取请求方法
if ($method === "CTFHUB") {
    echo $flag;  // 方法匹配 -> 返回 flag
} else {
    echo "请使用CTFHUB方法访问";
}

所以只要我们发送的 HTTP 请求第一行是 CTFHUB /index.php HTTP/1.1,服务器就会认为是合法请求,返回 flag。

核心知识点总结

概念说明
请求方法HTTP 请求行的第一个单词,是一个 token
标准方法GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、CONNECT、TRACE
自定义方法任何非标准字符串,如 CTFHUB、FLAG、TEST
方法大小写方法名区分大小写,CTFHUB != ctfhub
服务器处理由应用程序代码根据方法名判断,与协议无关

关联教程

本知识库中更深入的 HTTP 协议与 Web 基础: