Skip to content

七、协议

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工作流程示例

  1. 建立TCP连接:客户端与服务器通过三次握手建立连接。

  2. 发送请求

    http
    GET /about HTTP/1.1
    Host: www.example.com
    User-Agent: Chrome
  3. 返回响应

    http
    HTTP/1.1 200 OK
    Content-Type: text/html
    <html>...</html>
  4. 关闭连接(非持久连接时)。


(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-ControlETag等头部控制。
  • Cookie/Session:管理用户状态。
  • 跨域(CORS):通过Access-Control-Allow-Origin头部解决。

(8)实际应用建议

  • 使用开发者工具(浏览器F12)查看HTTP请求/响应。

image-20250329230111105

  • 安全性:优先选择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)安全注意事项

  1. 文件包含漏洞:伪协议常被用于文件包含漏洞利用

    • 如:include($_GET['file']) 传入 php://filter/convert.base64-encode/resource=config.php
  2. allow_url_fopen 和 allow_url_include

    • allow_url_fopen 控制是否允许打开远程文件
    • allow_url_include 控制是否允许包含远程文件
  3. 过滤用户输入:永远不要信任用户提供的伪协议路径

(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-[签到题]

image-20250405205728550

  • 解题:

抓包,将cookie字段的didi=no改为didi-yes,点击发送得到一段编码

image-20250405210313436

进行base64解码得到一个路径 ./data/index.php

image-20250405210659776

查看该url

image-20250405210924837

代码审计

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

image-20250405211745646

再进行base64解码得到flag

image-20250405211856834

image-20250405211911680

滇ICP备2025057983号-1