七、协议
1.http协议
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最广泛的协议之一,用于客户端(如浏览器)和服务器之间的通信。以下是HTTP协议的详细讲解:
(1)HTTP的基本概念
- 无状态协议:HTTP默认不保留之前的请求或会话信息(但可通过Cookie/Session实现状态管理)。
- 基于请求-响应模型:客户端发送请求,服务器返回响应。
- 应用层协议:基于TCP/IP协议(默认端口80,HTTPS为443)。
- 灵活可扩展:支持自定义头部、方法(如GET/POST)和状态码。
(2)HTTP请求(Request)
客户端向服务器发送的请求包含以下部分:
请求行
- 格式:
方法 URI HTTP版本
例如:GET /index.html HTTP/1.1
- 常见方法:
GET
:获取资源(参数在URL中)。POST
:提交数据(参数在请求体中)。PUT
:更新资源。DELETE
:删除资源。HEAD
:仅获取响应头。
请求头(Headers)
- 键值对形式,传递附加信息:
Host: example.com
(必需,指定服务器域名)。User-Agent: Mozilla/5.0
(客户端标识)。Content-Type: application/json
(请求体类型)。Cookie: name=value
(会话信息)。
请求体(Body)
- 可选,用于POST/PUT等携带数据(如表单或JSON)。
(3)HTTP响应(Response)
服务器返回的响应包含以下部分:
状态行
- 格式:
HTTP版本 状态码 状态描述
例如:HTTP/1.1 200 OK
- 常见状态码:
200 OK
:请求成功。301 Moved Permanently
:永久重定向。404 Not Found
:资源不存在。500 Internal Server Error
:服务器错误。
响应头(Headers)
- 包含元数据:
Content-Type: text/html
(响应体类型)。Set-Cookie: name=value
(设置Cookie)。Cache-Control: max-age=3600
(缓存控制)。
响应体(Body)
- 返回的实际内容(如HTML、JSON或文件)。
(4)HTTP工作流程示例
建立TCP连接:客户端与服务器通过三次握手建立连接。
发送请求:
httpGET /about HTTP/1.1 Host: www.example.com User-Agent: Chrome
返回响应:
httpHTTP/1.1 200 OK Content-Type: text/html <html>...</html>
关闭连接(非持久连接时)。
(5)HTTP与HTTPS的区别
- HTTPS = HTTP + SSL/TLS加密:
- 默认端口443。
- 数据加密传输,防止窃听或篡改。
- 需要CA证书验证服务器身份。
(6)HTTP版本演进
- HTTP/1.0:每个请求需单独建立连接。
- HTTP/1.1(主流):
- 持久连接(默认
Connection: keep-alive
)。 - 管道化(Pipeline)支持。
- 支持分块传输(
Transfer-Encoding: chunked
)。
- 持久连接(默认
- HTTP/2:
- 二进制分帧(提升效率)。
- 多路复用(解决队头阻塞)。
- 头部压缩(HPACK)。
- HTTP/3:基于QUIC协议(UDP实现,减少延迟)。
(7)关键特性
- 缓存机制:通过
Cache-Control
、ETag
等头部控制。 - Cookie/Session:管理用户状态。
- 跨域(CORS):通过
Access-Control-Allow-Origin
头部解决。
(8)实际应用建议
- 使用开发者工具(浏览器F12)查看HTTP请求/响应。
- 安全性:优先选择HTTPS,避免敏感信息明文传输。
- 性能优化:减少请求数、启用压缩、利用缓存。
2. php伪协议
PHP 伪协议(也称为流包装器,PHP Wrappers))提供了访问各种资源的统一方法,类似于文件系统。以下是主要的 PHP 伪协议:
(1)常用伪协议
file:// — 访问本地文件系统
file:///path/to/file.ext
- 默认协议,用于读取本地文件
- 示例:
file_get_contents('file:///etc/passwd')
http:// 和 https:// — 访问 HTTP(s) 资源
http://example.com/file.php
- 用于访问网络资源
- 示例:
file_get_contents('https://example.com')
php:// — 访问各种 I/O 流
php://input
php://output
php://memory
php://temp
- php://input:访问请求的原始数据(POST)
- php://filter:常用于文件包含漏洞利用
- 示例:
php://filter/read=convert.base64-encode/resource=index.php
- 示例:
data:// — 数据流封装器(RFC 2397)
data://text/plain,内容
data://text/plain;base64,编码内容
- 直接包含数据而不是外部文件
- 示例:
include('data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+')
phar:// — PHP 归档流
phar://path/to/archive.phar/file.php
- 用于访问 PHAR (PHP Archive) 文件中的内容
zip:// — 访问 ZIP 压缩包中的文件
zip://path/to/archive.zip#file.txt
- 需要绝对路径,且
#
需要编码为%23
(2)安全注意事项
文件包含漏洞:伪协议常被用于文件包含漏洞利用
- 如:
include($_GET['file'])
传入php://filter/convert.base64-encode/resource=config.php
- 如:
allow_url_fopen 和 allow_url_include:
allow_url_fopen
控制是否允许打开远程文件allow_url_include
控制是否允许包含远程文件
过滤用户输入:永远不要信任用户提供的伪协议路径
(3)实用示例
php
// 读取文件内容并Base64编码
$content = file_get_contents('php://filter/read=convert.base64-encode/resource=index.php');
// 使用data协议直接执行代码
include('data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+');
// 读取ZIP压缩包中的文件
$content = file_get_contents('zip://archive.zip%23file.txt');
(4)题目复现
题目:[签到题]
- 题目来源:Polarctf-web-[签到题]
- 解题:
抓包,将cookie字段的didi=no
改为didi-yes
,点击发送得到一段编码
进行base64解码得到一个路径 ./data/index.php
查看该url
代码审计
php
<?php
error_reporting(0);
$file = $_GET['file'];
if(!isset($file)) # 如果file参数未设定,则file赋值为1
$file = '1';
$file = str_replace('../', '', $file); # 过滤目录遍历符号"../"
include_once($file.".php");
highlight_file(__FILE__);
?>
使用php伪协议和双写绕过(测试到向上穿越了四层目录):
?file=php://filter/convert.base64-encode/resource=..././..././..././..././flag
再进行base64解码得到flag