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序列化处理器:

  1. php - 默认处理器,使用特定格式序列化
  2. php_binary - 使用二进制格式
  3. 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 漏洞产生条件

  1. 网站使用php_serialize处理器序列化Session
  2. 但使用php处理器反序列化Session
  3. 攻击者能够控制部分Session数据

3.2 攻击原理

  • php处理器使用|作为分隔符
  • 攻击者注入包含|的恶意序列化数据
  • 导致解析器错误识别键值对边界
  • 最终执行反序列化操作时触发漏洞

四、漏洞利用步骤

4.1 利用流程

  1. 确定站点使用不同的序列化和反序列化处理器
  2. 构造包含恶意对象的序列化字符串
  3. 通过可控参数将恶意数据注入Session
  4. 触发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 漏洞检测方法

  1. 检查服务器配置phpinfo()中的session.serialize_handler
  2. 寻找用户输入与Session的交互点
  3. 尝试注入特殊字符测试解析逻辑

七、高级利用技巧

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+
  • 某些利用链可能只在特定版本有效
  • 测试时需要匹配目标环境版本
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 处理器格式: php_serialize 处理器格式: 2.3 处理器配置 通过 session.serialize_handler 指令配置: 三、反序列化漏洞原理 3.1 漏洞产生条件 网站使用 php_serialize 处理器序列化Session 但使用 php 处理器反序列化Session 攻击者能够控制部分Session数据 3.2 攻击原理 php 处理器使用 | 作为分隔符 攻击者注入包含 | 的恶意序列化数据 导致解析器错误识别键值对边界 最终执行反序列化操作时触发漏洞 四、漏洞利用步骤 4.1 利用流程 确定站点使用不同的序列化和反序列化处理器 构造包含恶意对象的序列化字符串 通过可控参数将恶意数据注入Session 触发Session反序列化操作 4.2 示例攻击代码 五、防御措施 5.1 统一序列化处理器 确保整个应用使用相同的序列化处理器: 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+ 某些利用链可能只在特定版本有效 测试时需要匹配目标环境版本