session反序列化原理解读篇
字数 1430 2025-08-09 22:00:40
Session反序列化原理解读
一、Session机制基础
1.1 Session工作原理
- Session是服务器端用来跟踪用户状态的机制
- 服务器为每个用户创建唯一的Session ID
- Session数据默认存储在服务器文件系统中(如PHP的/tmp目录)
- 客户端通过Cookie或URL参数保存Session ID
1.2 Session存储方式
PHP支持多种Session存储处理器:
files- 默认方式,存储在文件系统中memcached/redis- 存储在内存数据库中user- 用户自定义处理器
二、PHP Session序列化机制
2.1 序列化处理器类型
PHP支持三种Session序列化处理器:
php- 默认处理器,使用特定格式序列化php_binary- 使用二进制格式php_serialize- 使用serialize()函数格式(PHP 5.5.4+)
2.2 序列化格式差异
php处理器格式:username|s:6:"admin";role|s:5:"admin";php_serialize处理器格式:a:2:{s:8:"username";s:5:"admin";s:4:"role";s:5:"admin";}
2.3 处理器配置
通过session.serialize_handler指令配置:
session.serialize_handler = "php_serialize"
三、反序列化漏洞原理
3.1 漏洞产生条件
- 网站使用
php_serialize处理器序列化Session - 但使用
php处理器反序列化Session - 攻击者能够控制部分Session数据
3.2 攻击原理
php处理器使用|作为分隔符- 攻击者注入包含
|的恶意序列化数据 - 导致解析器错误识别键值对边界
- 最终执行反序列化操作时触发漏洞
四、漏洞利用步骤
4.1 利用流程
- 确定站点使用不同的序列化和反序列化处理器
- 构造包含恶意对象的序列化字符串
- 通过可控参数将恶意数据注入Session
- 触发Session反序列化操作
4.2 示例攻击代码
// 攻击者构造的恶意序列化数据
$evil = '|O:4:"evil":1:{s:4:"code";s:10:"phpinfo();";}';
// 将恶意数据写入Session
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['data'] = $evil;
五、防御措施
5.1 统一序列化处理器
确保整个应用使用相同的序列化处理器:
session.serialize_handler = "php_serialize"
5.2 其他防护方法
- 对用户输入的Session数据进行严格过滤
- 使用
session_regenerate_id()防止Session固定攻击 - 限制敏感类对象的反序列化
- 使用PHP 7的
unserialize()过滤钩子
六、实际案例分析
6.1 常见触发场景
- 用户可控的Session数据(如用户名、用户资料)
- 通过Cookie注入恶意Session数据
- 文件上传+Session包含组合攻击
6.2 漏洞检测方法
- 检查服务器配置
phpinfo()中的session.serialize_handler - 寻找用户输入与Session的交互点
- 尝试注入特殊字符测试解析逻辑
七、高级利用技巧
7.1 利用POP链
- 寻找应用中可用的魔术方法(
__wakeup,__destruct等) - 构造属性可控的类对象
- 形成完整的"属性到代码执行"链
7.2 结合其他漏洞
- 文件包含+Session文件包含
- 反序列化+SSRF组合攻击
- 反序列化+phar协议利用
八、PHP版本差异
8.1 PHP 5与PHP 7区别
- PHP 7增加了
unserialize()的过滤钩子 - PHP 7对某些魔术方法的行为有变化
- PHP 7.1+对Session处理有优化
8.2 版本兼容性注意事项
php_serialize处理器需要PHP 5.5.4+- 某些利用链可能只在特定版本有效
- 测试时需要匹配目标环境版本