本文目录导读:

我来详细解释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会话反序列化漏洞主要来源于:
- 不同处理器的不当混用
- 用户可控数据直接存储到session
- 旧版本PHP的已知漏洞
最佳实践:
- 始终使用相同的序列化处理器
- 不要信任session中的数据
- 验证和清理所有用户输入
- 保持PHP版本更新
这个漏洞在CTF中很常见,但在实际生产环境中也需要高度重视。