HTTP协议详解【基础知识+详细例题】

[网址” 其实就是说的 URL]

前言

参考大佬文件,发布内容是第二次寒假回顾一下,记录学习过程

1. 简介

1.1. http协议

1.1.1. 什么是http协议

为了提供一种发布和接收 HTML 页面的方法,通过 HTTP 或者 HTTPS 协议请求的资源由统一资源标识符来标识。

HTTP(超文本传输协议)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上,通常使用端口 80

HTTPS(超文本传输安全协议)是 HTTP 的安全版本,它在 HTTP 下增加了 SSL/TLS 协议,提供了数据加密、完整性校验和身份验证。HTTPS 通常使用端口 443

协议:为了是数据在网络源头到达目的,网络通信的参与方必须遵守相同的规则,这套规则曾为协议,他的最终体现为在网络上传输的数据报的格式 ,通俗的来讲协议就是要保证网络通信的双方,能够互相对接,互相联系的暗号。

1.1.2. HTTP与HTTPS

HTTPS(超文本传输安全协议,Hypertext Transfer Protocol Secure)**是 HTTP 的安全版本,它在 HTTP 下增加了 **SSL/TLS** 协议,提供了**数据加密、完整性校验和身份验证**。

HTTPS 通常使用端口 443。

SSL/TLS 协议通过在通信双方之间建立一条**加密隧道**,确保数据在传输过程中不被窃听、篡改或冒充。

+ **身份验证 (Authentication)**:
  确认你访问的网站真的是它声称的那个(通过数字证书),防止“钓鱼网站”。
+ **数据加密 (Encryption)**:
  将明文数据转换为密文,即使黑客在网络中截获了数据,也无法解密看懂内容。
+ **数据完整性 (Integrity)**:
  防止数据在传输过程中被暗中修改。如果数据被动过,接收方会立即发现。

1.1.3. 如何分类

按**TCP/IP 四层模型** 进行分类 :

| 层级 | 核心协议 | 关键功能 |
| --- | --- | --- |
| 应用层 | HTTP, DNS, FTP, SMTP, SSH | 提供用户服务 |
| 传输层 | TCP, UDP | 端到端可靠/快速传输 |
| 网络层 | IP, ICMP, ARP | 跨网络寻址与路由 |
| 链路层 | Ethernet, Wi-Fi, PPP | 本地网络帧传输 |

1.1.4. HTTP协议工作过程

当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个HTTP请求,对应的服务器收到这个请求之后,经过计算就会返回一个HTTP响应,并且当我们访问一个网站的时候,可能涉及到不止一次的HTTP请求和相应的交互过程。

HTTP协议的重点特点:一发一收,一问一答

1.1.4.1. 请求与响应

客户端 服务器

建立连接 客户端向服务器发起一个 HTTP 请求

发送请求

处理请求 服务器接收到请求后,根据请求的类型(如GET、POST等)和请求的资源,进行相应的处理

发送响应 服务器将处理结果包装成HTTP响应消息,发送回客户端,客户端接收到响应后,根据响应内容(如HTML、图片等)渲染页面,展示给用户

关闭连接

1.1.4.1.1. HTTP 请求的结构

一个请求由四部分组成:

+ **请求行 (Request Line)**:包含请求方法(如 GET)、URL 和协议版本。

+ **请求头 (Request Headers)**:描述客户端环境、身份验证等信息(如 `User-Agent`, `Host`)。

+ **空行**:必不可少,用于区分头部和主体。

+ **请求体 (Request Body)**:发送给服务器的数据(仅在 POST/PUT 等方法中使用)。

示例:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
请求行
GET /index.html HTTP/1.1
GET:请求方法,表示从服务器获取资源(只读操作)。
/index.html:请求路径,指定服务器上的目标资源(根目录下的index.html文件)。
HTTP/1.1:协议版本,使用HTTP 1.1标准(支持持久连接、分块传输等特性)。


请求头
Host: www.example.com
目标服务器的域名,用于在共享IP的服务器上区分不同网站(HTTP 1.1强制要求)。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
客户端身份标识:表明请求来自Windows 10 64位系统的Firefox 91.0浏览器(Gecko是浏览器渲染引擎)。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
客户端可接受的资源类型:优先HTML(text/html),其次XML、图片等;
                      q=0.9表示权重(值越高优先级越高)。
Accept-Encoding: gzip, deflate
客户端支持的压缩方式:服务器可使用gzip或deflate压缩响应内容,减少传输体积。
Connection: keep-alive
要求建立持久连接:同一TCP连接可发送多个请求/响应,避免频繁建立连接的开销(HTTP 1.1默认开启)。
1.1.4.1.2. HTTP 响应的结构

一个响应由四部分组成:

+ **状态行 (Status Line)**:包含协议版本、状态码(如 200)和状态描述。

+ **响应头 (Response Headers)**:描述服务器信息、数据类型等(如 `Content-Type`, `Server`)。

+ **空行**。

+ **响应体 (Response Body)**:服务器返回的实际数据(如 HTML、图片、JSON)。

HTTP/1.1 200 OK
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <!-- The rest of the HTML content -->
</body>
</html>
这是一个HTTP 1.1协议的成功响应,表示服务器已正常处理请求并返回index.html资源。以下是逐行解析:

状态行
HTTP/1.1 200 OK
HTTP/1.1:协议版本。
200:状态码,表示请求成功(最常见的成功状态码)。
OK:状态描述,对状态码的文字说明。

响应头
Date: Wed, 18 Apr 2024 12:00:00 GMT
服务器生成响应的GMT时间(格林尼治标准时间)。
Server: Apache/2.4.1 (Unix)
服务器软件信息:使用Apache 2.4.1(运行在Unix系统上)。
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
资源(index.html)的最后修改时间,用于浏览器缓存验证(如If-Modified-Since请求头)。
Content-Length: 12345
响应体的字节大小(12345字节),帮助客户端确认数据完整性。
Content-Type: text/html; charset=UTF-8
响应体的MIME类型:text/html表示HTML文档,charset=UTF-8指定字符编码为UTF-8。

响应体
空行分隔响应头与响应体,之后是index.html的HTML内容(网页结构),浏览器会解析并渲染为页面。
1.1.4.1.3. HTTP 请求详解
1.1.4.1.3.1. 常见的 HTTP 请求方法

方法

作用

安全角度说明

GET

获取资源

用于查询、搜索、分页等只读操作,参数暴露在URL中,适合非敏感数据传递。

POST

提交数据

用于登录、表单提交等写操作,参数在请求体中,适合敏感数据(需配合HTTPS加密)。

PUT

更新资源

REST风格API中用于全量更新资源,需严格验证权限,避免未授权修改。

DELETE

删除资源

高危操作,需强制身份验证和权限校验,建议通过POST模拟(避免浏览器预请求风险)。

HEAD

获取响应头

用于信息收集(如检测资源是否存在),无响应体,风险较低但需限制频率。

OPTIONS

查询支持方法

常用于CORS预检请求,暴露服务器支持的HTTP方法,需谨慎返回敏感信息。

GET方法:

数据附加在 URL 之后,以问号 `?`开始,参数之间用 `&` 分隔。

GET /search.php?keyword=php&page=1 HTTP/1.1
Host: example.com

POST方法:

数据放在请求体中,不会显示在 URL 里

POST /login.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

username=admin&password=123456

【可以用hackbar也可以用bp,上述是在bp里面的写法,注意要空一行】

1.1.4.1.3.2. 常见的请求头
  • 1. 基础信息类
+ **Host**: 指定请求的服务器域名和端口号。
+ **User-Agent**: 告诉服务器客户端的浏览器类型、操作系统及版本信息。
+ **Referer**: 标识当前请求是从哪个页面链接过来的(来源页面)。
+ **Connection**: 决定当前的底层 TCP 连接在请求完成后是否保持打开(如 `keep-alive`)。
  • 2. 内容协商类
+ **Accept**:
  告诉服务器客户端能够处理的媒体类型(MIME 类型),如 `text/html`。
+ **Accept-Encoding**:
  告知服务器客户端支持的内容压缩算法,如 `gzip` 或 `br`。
+ **Accept-Language**:
  告知服务器客户端期望的语言环境,用于实现多语言页面。
+ **Content-Type**:
  在 POST 请求中,描述请求体的数据格式
(如 `application/x-www-form-urlencoded` 或 `multipart/form-data`)。

其中媒体格式类型:

● text/html : HTML格式
● text/plain :纯文本格式
● text/xml : XML格式
● image/gif :gif图片格式
● image/jpeg :jpg图片格式
● image/png:png图片格式
  • 表单提交类:
● application/x-www-form-urlencoded:
默认的表单提交方式,数据被编码为键值对,用 & 分隔,如 name=admin&pass=123。
● multipart/form-data:文件上传
● application/json:JSON 数据,常用于API 接口调用
  • 认证与状态类
+ **Cookie**:
  HTTP 是“无状态”的,客户端存储并发送给服务器的键值对数据,常用于维持登录状态或追踪用户。
+ **Authorization**:
  用于提供服务器验证身份所需的凭证(如 Basic 认证或 Bearer Token)。
  • 安全与特殊类
+ **X-Forwarded-For**:
  记录请求经过的代理服务器 IP,常用于获取客户端的真实 IP 地址。
+ **Origin**:
  标识跨域请求(CORS)或 POST 请求的来源,不包含路径信息,仅含协议、域名和端口。

### HTTP 响应详解

**1. 常见的 HTTP 响应头**

| <font style="color:black;">响应头</font> | <font style="color:black;">核心作用</font> |

| --- | --- |

| <font style="color:black;">Content-Type</font> | <font style="color:black;">指定响应体类型</font> |

| <font style="color:black;">Content-Length</font> | <font style="color:black;">响应体长度</font> |

| <font style="color:black;">Set-Cookie</font> | <font style="color:black;">下发 Cookie</font> |

| <font style="color:black;">Location</font> | <font style="color:black;">重定向地址</font> |

| <font style="color:black;">Server</font> | <font style="color:black;">服务器信息</font> |

| <font style="color:black;">Cache-Control</font> | <font style="color:black;">缓存策略</font> |

| <font style="color:black;">Access-Control-Allow-Origin</font> | <font style="color:black;">允许跨域来源</font> |

响应头

核心作用

Content-Type

指定响应体的MIME类型(如text/html

application/json

),指导客户端解析数据格式。

Content-Length

定义响应体的字节长度,帮助客户端确认数据完整性(避免传输中断或篡改)。

Set-Cookie

向客户端下发Cookie(如会话ID、用户偏好),用于状态保持或身份验证。

Location

配合3xx状态码使用,指定重定向目标地址(如登录后跳转首页)。

Server

暴露服务器的软件信息(如Apache/2.4.41

),可能泄露版本细节(建议隐藏或模糊处理)。

Cache-Control

控制客户端/代理的缓存策略(如max-age=3600

表示缓存1小时,no-cache

强制验证)。

Access-Control-Allow-Origin

CORS机制中允许的跨域请求来源(如*

表示允许所有域名,或指定具体域名如https://example.com

)。

X-Frame-Options

防御点击劫持攻击,限制页面是否可被嵌入iframe(值为DENY

SAMEORIGIN

ALLOW-FROM

)。

1.1.4.2. B/S结构

B/S结构(Browser/Server,浏览器/服务器模式),是目前互联网应用最主流的软件架构模式。

简单来说,你在电脑或手机上通过浏览器访问网站(如百度、淘宝、Bilibili)的这种模式,就是典型的 B/S 结构。

骨架(B/S结构)与血液(HTTP)

1.1.5. HTTP 状态码

状态码(服务器对客户端请求的响应)

  • 1xx(信息性状态码):表示接收的请求正在处理。
  • 2xx(成功状态码):表示请求正常处理完毕。
  • 3xx(重定向状态码):需要后续操作才能完成这一请求。
  • 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
  • 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。
1.1.5.1. 1xx(信息性状态码):表示接收的请求正在处理。
100 Continue:请求的初步部分已接收,客户端应继续发送请求。
101 Switching Protocols:服务器同意切换协议。
1.1.5.2. 2xx(成功状态码):表示请求正常处理完毕。
200 OK:请求成功,具体内容取决于HTTP方法(如GET、POST)。
201 Created:请求成功并创建了新资源。
204 No Content:请求成功但无返回内容。
1.1.5.3. 3xx(重定向状态码):需要后续操作才能完成这一请求。
301 Moved Permanently:资源已永久移动到新位置。
302 Found:资源临时移动到新位置。
304 Not Modified:资源未修改,可使用缓存版本。

1.1.5.4. 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
400 Bad Request:请求语法错误或无效。
401 Unauthorized:需要身份验证
403 Forbidden:服务器拒绝请求,客户端无权限访问。
404 Not Found:资源未找到。
1.1.5.5. 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。
500 Internal Server Error:服务器遇到未知错误。
502 Bad Gateway:网关或代理收到无效响应。
503 Service Unavailable:服务器暂时不可用(如维护或过载)。
504 Gateway Timeout:网关超时未收到响应。

1.1.6. 版本

  • HTTP/1.1:支持持久连接,允许多个请求/响应通过同一个 TCP 连接传输,减少了建立和关闭连接的消耗。
  • HTTP/2:基于二进制分帧,支持多路复用,允许同时通过单一的 HTTP/2 连接发起多重的、独立的、双向的交流。
  • HTTP/3:基于 QUIC 协议,旨在减少网络延迟,提高传输速度和安全性

1.1.7. 安全性

HTTP 本身是不安全的,因为传输的数据未经加密,可能会被窃听或篡改

在 HTTP 上加入 SSL/TLS 协议,为数据传输提供了加密和身份验证,即https

1.2. URL

1.2.1. 什么是URL

**URL** 的全称是 **Uniform Resource Locator**,中文译为 **统一资源定位符**。

**URL 是 HTTP 请求的目标**: HTTP 协议必须依靠 URL 才能知道要连接哪台服务器(域名/IP),以及请求该服务器上的哪个资源(路径)。

平时我们上网的网址就是URL,互联网上的每一个文件都有一个统一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它

1.2.2. URL的格式

URL的标准格式如下:

协议类型:[//服务器地址][:端口号][/资源层级UNIX文件路径]文件名[?查询字符串][#片段标识符]

URL的完整格式如下:

协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

一个典型的 URL 由以下几个部分组成,每个部分都有其特定的功能:

例子:

`**https://www.example.com:443/path/to/file.php?id=1#section1**`

| 组成部分 | 一句话说明 | 示例(基于示例 URL) |
| --- | --- | --- |
| **协议** | 规定浏览器与服务器通信的“语言”和方式。 | `https://` |
| **主机名/域名** | 指向互联网上存放资源的某台具体服务器的地址。 | `www.example.com` |
| **端口** | 服务的“入口”。HTTPS 默认为 443,HTTP 默认为 80。 | `:443` |
| **路径** | 资源在服务器上的存储位置,类似于电脑文件的目录。 | `/path/to/file.php` |
| **查询参数** | 传递给服务器的额外数据,以 `?`开始,`&`分隔键值对。 | `?id=1` |
| **锚点** | 指向页面内的特定位置(如某个标题),数据不发送给服务器。 | `#section1` |

当你访问 `https://www.hnusec.com/members?_rsc=vusbg` 时,HTTP 协议会将 URL 拆解并填入报文中

1.2.3. URL编码

URL编码(也称为百分比编码)是一种将数据转换为可以安全包含在URL中的格式的编码方式

它用于处理可能在URL中无效或有特殊含义的字符,例如空格、非ASCII字符和特殊符号。

标志性的前缀:`%`

空格 → %20
# → %23
& → %26
中 → %E4%B8%AD
1.2.3.1. 安全字符(无需编码)

以下字符可以直接在 URL 中使用:

+ **字母**:`A-Z`, `a-z`。
+ **数字**:`0-9`。
+ **特定符号**:连字符 `-`、下划线 `_`、点 `.`、波浪号 `~`。
1.2.3.2. 需要编码的字符
+ **空格**:
+ 编码为 `%20` 或 `+`。
+ **非安全字符**:
+ 具有特殊语法的符号,如 `!`, `@`, `#`, `$`, `%`, `^`, `&`, `*`, `()`, `{}`, `[]`, `|`, `\` 等。
+ **非 ASCII 字符(如中文)**:
+ 所有非 ASCII 字符都会编码为 `%` 后跟 UTF-8 编码的十六进制值。

1.2.4. URL的参数

1.3. 理解浏览器与服务器是如何通信的

1.首先我们在地址栏上输入我们想要打开的网址,然后我们通常会按下回车。这样一个请求就由浏览器以一种满足http协议的请求报文的形式发往服务器,请求报文中包含了要请求的页面地址,请求的文件类型等一系列信息。

2.在请求报文传递至客户端得网络设备的时候,网络设备把请求报文包装在一个满足TCP协议的数据中,通过网线传向服务器的网络设备。

3.服务器的网络设备接收到数据后,使用特殊的算法将数据解译,重新恢复成浏览器发出满足http协议的请求报文的形式,然后传向服务器软件。

4.服务软件得到请求报文后,根据请求报文所请求的页面地址在服务器的数据库中找到相应的页面,然后生成满足http协议的响应报文发向浏览器。响应报文中包括了响应报文头和被请求页面的代码。

5.响应报文通过服务器的网络设备,被包装在一个满足TCP协议的数据,通过网线传向客户端的网络设备。

6.客户端的网络设备将响应报文解析,然后传给浏览器软件,浏览器在将响应报文解析,这样我们就在浏览器上看到了想要看到的网页。

1.4. 理解浏览器是如何访问网站

基于HPP协议(超文本传输协议),浏览器作为客户端向服务器端发送一次请求,而服务器端在接收到这次请求后,给浏览器反馈一个响应


1.当用户访问一个网站时,首先输入访问的URL,先通过DNS进行域名解析,将域名解析成对应的IP地址

2.经过解析之后,浏览器会发起一个TCP的连接请求

3.服务器接受请求后,通过三次握手建立连接

4.客户端在确认建立连接成功后,向服务端发送HTTP请求格式的数据包

5.服务器端解析HTTP数据包,执行用户的这次请求并生成一个HTTP响应格式的数据包,发送给客户端

6.浏览器在收到服务器端的数据包之后再进行解析,再通过HTML格式呈现给用户

7.客户端再通过四次握手释放连接

实战

1.1. 题目:黑神话悟空

[SWPUCTF 2024 秋季新生赛]http标头

https://www.nssctf.cn/problem/5942

1.1.1. 题目

1.1.2. 尝试与解题

1.1.2.1. 第一步(date)

点击开始挑战之后,出现题目要求

查询得知,黑神话悟空发布时间为2024年8月20日

1.1.2.1.1. 注意:{此处要注意date的格式}

一般要根据原来的格式,去翻翻找找,是有提示的

Tue, 03 Mar 2026 07:18:06 GMT根据这个提示,来修改dete的格式

Tue, 20 Aug 2024 00:00:00 GMT

1.1.2.1.2. 使用f12的hackbar

【这个小插件,添加该内容】

1.1.2.2. 第二步(User-Agent)

这个浏览器怎么改,用user-agent

1.1.2.3. 第三步(Cookie)

曲奇?其实就是Cookie,但是他的值(value)是键值对的方式展现,即a=b等

所以,这个的value应该就是monkey=BlackMonkey

😭不对,

后面查了一下,cookie=BlackMonkey

【因为爱吃曲奇牌子的BlackMonkey,即cookie(曲奇)】

1.1.2.4. 第四步(Referer)

很简单

1.1.2.5. 第五步(X-Forwarded-For)

本地回环地址 要知道127.0.0.1

1.1.3. 总结知识点

1.1.3.1. 1. Cookie

作用:存储身份凭证(如登录状态、权限标识)。
CTF考点

  • 越权访问:修改admin=0admin=1直接进入管理员后台。
  • 注入绕过:将SQL注入Payload(如id=1' OR 1=1#)写入Cookie参数,突破URL/请求体过滤。
  • 会话劫持:窃取有效Cookie值(如sessionid=xxx)替换自身Cookie,直接登录目标账户。

案例:某题目通过is_login=0限制未登录用户,修改为is_login=1即可绕过登录。

1.1.3.2. 2. X-Forwarded-For (XFF)

作用:告知服务器客户端真实IP(常用于代理场景)。
CTF考点

  • IP白名单绕过:伪造本地回环IP(127.0.0.1)或信任IP(如192.168.1.1),访问后台接口(如/admin)。
  • 频率限制绕过:多次修改XFF值(如127.0.0.1, 192.168.1.2),突破访问次数限制。

案例:题目要求“仅本地用户可访问”,添加X-Forwarded-For: 127.0.0.1即可获取flag。

1.1.3.3. 3. User-Agent (UA)

作用:标识客户端设备/浏览器信息(如Mozilla/5.0)。
CTF考点

  • 爬虫拦截绕过:将UA改为浏览器标识(如NewStarCTF2023),绕过服务器对爬虫的限制。
  • 版本适配漏洞:部分网站对特定UA(如旧版IE)返回不同内容,可能暴露敏感信息。

案例:某题目要求UA包含NewStarCTF2023,修改后即可通过验证。

1.1.3.4. 4. Referer

作用:告知服务器请求来源页面。
CTF考点

  • 来源校验绕过:伪造Referer: newstarctf.com,绕过“仅本站请求可访问”的限制。
  • CSRF防御绕过:部分网站依赖Referer验证,删除或修改该头可触发CSRF漏洞。

案例:上传文件时需Referer为example.com,修改后即可成功上传恶意文件。

1.1.3.5. 5. Content-Type

作用:指定请求体的MIME类型(如application/x-www-form-urlencoded)。
CTF考点

  • 文件上传绕过:将multipart/form-data改为image/jpeg,绕过客户端对文件类型的校验。
  • 参数解析漏洞:部分框架对非标准Content-Type(如application/json)处理不当,导致注入或越权。

案例:上传.php文件时,将Content-Type改为image/png,绕过服务器对文件后缀的检测。

1.1.3.6. 6. Host

作用:指定服务器域名或IP(如Host: example.com)。
CTF考点

  • 虚拟主机漏洞:通过修改Host为内部域名(如internal.example.com),访问未公开的后台服务。
  • SSRF绕过:结合Host头构造内部服务请求(如Host: 127.0.0.1:8080),读取本地文件或攻击内网服务。

案例:某题目通过Host头判断是否为管理员,修改为admin.example.com即可访问管理界面。

1.1.3.7. 7. 请求方法(GET/POST/PUT/DELETE)

作用:定义对资源的操作类型。
CTF考点

  • 方法限制绕过:网站禁止POST上传时,用PUT方法直接上传shell.php
  • 越权操作:用DELETE方法删除服务器文件(如DELETE /config.php)。
  • OPTIONS探测:发送OPTIONS请求获取服务器允许的方法(如发现允许PUT,即可上传文件)。

案例:某题目仅开放GET请求,用POST方法提交参数可绕过SQL注入过滤。

1.1.3.8. 实战技巧总结
  1. 抓包工具:用Burp Suite拦截请求,修改上述字段后重放。【hackbar也可以】
  2. 组合利用:如伪造XFF+UA+Referer,绕过多重验证。
  3. 敏感信息泄露:通过Server头(如Apache/2.4.29)判断服务器版本,寻找对应漏洞。

这些HTTP字段是CTF Web题的基础,掌握其原理和利用场景能快速突破多数题目。

1.1.4. 嗯~本道题

由黑神话悟空得到:

利用hackbar解题

URL 为所在网址

Date 可以篡改时间(注意格式,通过network的信息搜集)

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件

Cookie是网站为了识别用户和跟踪会话而存储在用户本地终端中的文本数据,是键值对,a=123的格式

X-Forwarded-For是一个HTTP请求头字段,用于识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址。

referer是HTTP中的一个请求头,其内容指明了请求资源的来源地址

127.0.0.1回环地址

1.2. [SWPUCTF 2022 新生赛]xff

题目来源:https://www.nssctf.cn/problem/2884在nssctf的平台上。

1.2.1. 题目

1.2.2. 尝试与解题

入手点:【本人乍一看并不知道题目是什么意思】

1.2.2.1. 思路来源
1.2.2.1.1. 题目名称的直接提示

题目明确包含“xff”关键词,而X-Forwarded-For是Web安全中最常见的HTTP头之一,常用于CTF的“IP伪造”类题目(如限制本地IP访问时,通过XFF模拟127.0.0.1)。

1.2.2.1.2. CTF常见考点的经验积累
  • 在CTF竞赛中,**“本地访问”**类题目(如提示“仅允许127.0.0.1访问”)的经典解法就是伪造XFF头。
  • 这类题目通常不会直接显示提示,而是通过题目名称或隐藏信息引导选手联想到HTTP头操作。
  • 【本道题提到"own"】
1.2.2.1.3. 对HTTP协议的理解

XFF头的核心作用是标识客户端真实IP,而服务器可能依赖该字段判断访问来源。通过修改请求头中的XFF值,即可绕过IP验证逻辑。

1.2.2.2. xxf的知识点
1.2.2.2.1. 基本定义

XFF是一个HTTP请求头字段,用于标识客户端通过代理/负载均衡器访问服务器时的原始IP地址

当请求经过代理时,服务器默认只能看到最后一个代理的IP,而XFF会记录完整的请求链路(客户端IP + 代理IP列表)。

1.2.2.2.2. 格式与工作原理
  • 格式X-Forwarded-For: 客户端IP, 代理1IP, 代理2IP...
    例如:X-Forwarded-For: 192.168.1.100, 10.0.0.1, 10.0.0.2
  • 规则:最左侧是原始客户端IP,右侧依次是请求经过的代理IP,最右侧为最近的代理IP
1.2.2.2.3. 核心作用
  • 获取真实IP:帮助服务器记录用户真实IP(而非代理IP),用于日志统计、地域分析等。
  • 安全与测试:在CTF或渗透测试中,可通过伪造XFF头绕过IP限制(如模拟127.0.0.1本地访问)。
1.2.2.2.4. 安全注意事项
  • 可伪造性:XFF头可被任意修改,服务器需结合REMOTE_ADDR(TCP连接的真实IP)等字段验证可信度。
  • 隐私风险:可能泄露用户真实IP,需谨慎处理敏感场景。
1.2.2.2.5. 常见应用场景
  • CTF题目:如要求“仅允许本地IP访问”时,添加X-Forwarded-For: 127.0.0.1即可绕过。
  • 开发测试:模拟多代理环境,验证服务端对IP的处理逻辑。

简单来说,XFF是代理场景下“IP追踪”的关键工具,但使用时需注意其可伪造性哦! 🛡️

1.2.3. 解答

在bp拦截补充:X-Forwarded-For:127.0.0.1

页面中提示Must be jump from Home Page.必须要从本页面去跳转

增加:Referer:127.0.0.1

或者Referer:http://node5.anna.nssctf.cn:27753/

Flag: NSSCTF{th1s_xff_1s_e4ay}

XFF:告诉服务器当前请求者的最终IP。在一些情况下,攻击者可能会尝试伪造X-Forwarded-For字段来隐藏其真实IP地址,因此在使用XFF时需要谨慎验证其真实性。

Referer:它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。】

1.2.4. 参考大佬

1.3. [LitCTF 2023]Follow me and hack me

题目来源:https://www.nssctf.cn/problem/3864nssctf平台

1.3.1. 题目

1.3.2. 尝试与解题

第一个

第二个

NSSCTF{b7f7b36b-ec48-4ebc-a24c-7c38e316b31e}

1.4. [SWPUCTF 2021 新生赛]Do_you_know_http

题目来源:https://www.nssctf.cn/problem/385nssctf平台

1.4.1. 题目

1.4.2. 尝试与解题

1.4.2.1. 第一步

翻译这句话:请使用“WLLM”浏览器!

那么改动的内容是:User-Agent

1.4.2.2. 第二步

出现下一个界面:

大概就是,你只能在本地阅读这个文件,而现在你的地址是121,207,42,25,所以要将ip改掉,改成本地回环地址127.0.0.1

NSSCTF{ff9bd062-0fa2-4c55-a569-7dedb524126a}

1.4.2.3. 总结(针对什么内容修改什么内容)
1.4.2.3.1. 模拟身份(浏览器/设备)
  • 触发场景:要求“使用指定浏览器(如WLLM)”“用手机访问”“模拟特定设备”。
  • 修改字段User-Agent
  • 示例
    • 模拟WLLM浏览器:User-Agent: WLLM Browser/1.0
    • 模拟手机:User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1
1.4.2.3.2. 绕过IP限制
  • 触发场景:要求“仅本地访问(127.0.0.1)”“限制特定IP段访问”。
  • 修改字段X-Forwarded-For(或X-Real-IP
  • 示例
    • 模拟本地IP:X-Forwarded-For: 127.0.0.1
    • 模拟指定IP:X-Forwarded-For: 192.168.1.100
1.4.2.3.3. 处理Cookie验证
  • 触发场景:要求“登录后访问”“携带Session/Ticket”。
  • 修改字段Cookie
  • 示例
    • 携带登录态:Cookie: sessionid=abc123; username=test
1.4.2.3.4. 模拟Referer来源
  • 触发场景:要求“从指定页面跳转访问”“限制Referer为空”。
  • 修改字段Referer
  • 示例
    • 模拟从百度跳转:Referer: https://www.baidu.com
1.4.2.3.5. 处理Content-Type与数据格式
  • 触发场景:要求“POST JSON数据”“上传文件”“表单提交”。
  • 修改字段Content-Type
  • 示例
    • JSON格式:Content-Type: application/json
    • 表单提交:Content-Type: application/x-www-form-urlencoded
1.4.2.3.6. 模拟认证信息
  • 触发场景:要求“携带Token访问”“Basic Auth认证”。
  • 修改字段Authorization
  • 示例
    • Bearer Token:Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    • Basic Auth:Authorization: Basic dXNlcjE6cGFzc3dvcmQx(Base64编码的user1:password1

1.5. [LitCTF 2023]Http pro max plus

这道题我没有找到地点,但是很有意思,只好看别的大佬的了

x-forwarded-for:127.0.0.1

client-IP:127.0.0.1

referer:http://pornhub.com

user-agent:Chrome

via:Clash.win

/wtfwtfwtfwtf.php

f12找/sejishikong.php

1.5.1. 这个代理:

1.5.1.1. 一

客户端的IP地址伪造、CDN、反向代理、获取的那些事儿_ip cdn伪装-CSDN博客

获取用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就像您就是完全使用那台代理服务器直接访问对象。

1.5.1.2. Via请求头:代理追踪与安全解析

Via是HTTP协议中的通用首部,由代理服务器自动添加,用于记录请求/响应经过的代理节点信息,核心作用是追踪转发路径、防止循环请求、标识协议能力

1.5.1.2.1. 核心作用
  • 路径追踪:每经过一个代理,Via追加该代理的信息(如协议版本、代理名称),形成完整的转发链路。
  • 防循环请求:代理通过检查Via中是否包含自身标识,避免请求在代理间无限循环。
  • 协议能力标识:服务器通过Via了解请求经过的代理支持的HTTP版本(如1.0/1.1),优化响应策略。
1.5.1.2.2. 语法与示例

Via的格式为:[协议名/]<协议版本> <代理标识>[注释],多个代理用逗号分隔。

  • 示例1(单个代理)
    Via: 1.1 vegur(表示经过名为vegur的代理,使用HTTP/1.1协议)
  • 示例2(多个代理)
    Via: 1.0 fred, 1.1 p.example.net(先经过fred代理,再经过p.example.net代理)
1.5.1.2.3. 安全与隐私注意事项
  • 隐私保护:代理可使用假名(如fred)替代真实IP/域名,避免泄露内部网络结构。
  • 高匿名代理:若代理未修改Via,服务器可能通过该字段识别代理使用痕迹;高匿名代理会删除或伪造Via以隐藏代理身份。
  • 合规风险:使用代理时需遵守目标网站的robots.txt协议和地域法律(如GDPR禁止未经授权的数据采集)。
1.5.1.2.4. 与其他代理头的区别

字段

作用

常见场景

Via

记录代理路径,防循环

所有代理转发请求

X-Forwarded-For

伪造客户端真实IP

绕过IP限制(如仅本地访问)

Proxy-Authorization

代理身份认证信息

需要登录的代理服务器

1.5.1.2.5. 总结

Via是HTTP代理的“日志记录器”,通过它可追踪请求链路,但也可能暴露代理使用痕迹。在CTF或渗透测试中,若题目要求“隐藏代理痕迹”,需删除或修改Via字段;若需诊断代理循环问题,则可通过Via分析转发路径。 🛡️

1.6. [MoeCTF 2021]Do you know HTTP

https://www.nssctf.cn/problem/3408

检查一下你的学习成果吧
仅仅学习了HTTP请求头相关内容,你可能会发现浏览器已经不足以让你便利的去解决问题了,试试burpsuite!
https://github.com/XDSEC/moeCTF_2021

1.6.1. 解题

题目已经提示,使用bp来解题

1.6.1.1. 第一步

【1】误区:题目要求,用HS请求,我以为是?HS=

实际上是像get这种的请求方式

用bp对请求方式进行修改

将GET改为HS

【2】误区:

【注意,我发现我在拦截的时候,出现了很多的请求,导致我不知道哪一个是我要修改的】如下面的错误示范

HS/collect/pvoriginFrom=http%3A%2F%2Fnode5.anna.nssctf.cn%3A24911%2F&id=nGp0ycKWRnaOEGGwQW&uin=4746391841&version=1.41.10&aid=dad1ffcb-3dfa-4986-86ed-8f3ed69c9d4b&env=production&platform=3&netType=4&vp=954%20*%20512&sr=1440%20*%20900&sessionId=session&from=http%3A%2F%2Fnode5.anna.nssctf.cn%3A24911%2F&referer= HTTP

这是站点埋点的上报统计请求

  • 请求路径里的collectpv都是固定的统计上报关键词
  • 里面的originFromfromreferer都是用来记录页面来源,idsessionId是用户标识,version是SDK版本——这些全是统计用的参数,和你要做操作的业务功能无关
1.6.1.2. 第二步

改完这个请求方式后,他要求只有本地ip才可以,所以继续在reapter里面修改

可以在右侧修改,也可以直接在左侧修改,然后send

1.6.1.3. 第三步

希望我从这个地点过来

Referer一下就好了

1.6.1.4. 第四步

User-Agent改一下

1.6.2. 总结:

这题其实就是在考察http请求头的修改应用,本人卡在了第一步这个HS这个请求方式没见过,不知道是请求方式,在修改时,因为很多的请求过来,不知道哪一个是我需要修改的,同时其他的请求头内容有点生疏。

1.7. [SWPUCTF 2021 新生赛]babyrce

1.7.1. 题目

<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1) 
{
    include "../next.php";
}
else
    echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!

1.7.2. 解题

1.7.2.1. 第一步

if else很容易看出要使得COOKIE中admin=1

1.7.2.2. 第二步

访问这个.php文件,发现新的代码

<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
  $ip=$_GET['url'];
  if(preg_match("/ /", $ip)){
      die('nonono');
  }
  $a = shell_exec($ip);
  echo $a;
}
?>

就是用get的方式输入url来求值,注意有这个过滤(空格)

将空格用%09过滤,发现不报错了,但是无结果?

自以为是,注意flag不一定在/flag里头,你要去寻找

ls查找当前目录下

ls查找主目录下

找到flag在目录fllllllaaaaaagggggggg里头

1.7.3. 总结

注意:不要下意思以为flag在哪里,要去查找,一大坑点之一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值