博客
关于我
PHP serialize && unserialize Security Risk Research
阅读量:407 次
发布时间:2019-03-05

本文共 1880 字,大约阅读时间需要 6 分钟。

PHP 序列化与反序列化技术详解

序列化的定义

序列化是一种将对象、数组等复合数据类型转换为可以存储和传输的字节流或字符串的过程。在PHP中,序列化主要通过serialize()函数实现,反序列化通过unserialize()函数恢复。序列化的核心优势在于能够将复杂数据结构化为简单的存储形式,便于传输或存储。

序列化的优点

  • 持久化存储:将对象转换为可存储的格式,便于长期保存或传输。
  • 远程调用:在分布式系统中,序列化是实现远程过程调用的基础。
  • 数据传输:通过序列化,复杂数据可以被高效传输。
  • 序列化的实现

    serialize()函数将值转换为一个字符串,包含对象的类型信息和字段。序列化过程中,对象会经历以下声明周期:

  • __sleep():在对象销毁前获得执行权限。
  • __destruct():执行对象的销毁操作。
  • 序列化的字符串格式

    PHP序列化字符串采用特定的格式编码,各类型的序列化规则如下:

    • 标量类型NULLbooleanintegerdoublestring
    • 数组a表示数组,后跟元素信息。
    • 对象O表示对象,后跟类名和成员信息。
    • 引用r表示对象引用,R表示指针引用。
    • Unicode字符串U表示UTF-8编码的字符串。

    序列化的示例

    class SampleClass {
    var $value;
    }
    $a = new SampleClass();
    $a->value = $a;
    $b = new SampleClass();
    $b->value = &$b;
    $a->value = 1;
    $b->value = 1;
    var_dump($a);
    var_dump($b);

    输出结果显示,$a->value$b->value是同一个对象引用,而$b->value是指针引用。

    反序列化的实现

    unserialize()函数将序列化字符串转换为对应的PHP值。反序列化过程中,对象会经历以下声明周期:

  • __construct():执行对象注册和成员初始化。
  • __wakeup():在构造函数执行后获得执行权限。
  • 序列化与反序列化的安全风险

    序列化和反序列化过程中存在多种安全风险,主要包括:

  • 对象注入:通过控制序列化字符串,攻击者可以注入恶意代码。
  • PHP Session 序列化漏洞:默认的phpphp_binary序列化处理器存在安全漏洞。
  • 基于序列化的Webshell隐藏:攻击者可以通过构造特定的序列化字符串隐藏Webshell。
  • PHP 内存破坏漏洞

    PHP中存在多个内存破坏漏洞,例如:

  • CVE-2014-8142:在php_date.c中发现内存破坏漏洞。
  • CVE-2015-0231:通过unserialize()函数的DateTime*对象触发内存破坏。
  • PHP Session 序列化处理机制

    PHP提供了多种序列化处理器,包括:

  • php:默认处理器,采用php格式存储SESSION数据。
  • php_binary:采用二进制格式存储SESSION数据。
  • php_serialize(PHP 5.5.4 及以上):采用serialize()函数生成的数组格式存储SESSION数据。
  • 默认的phpphp_binary处理器存在对象注入风险,攻击者可以通过构造特定的SESSION文件进行反序列化注入。

    开源CMS 中的漏洞

    许多开源CMS(如WordPress、Joomla)在序列化和反序列化过程中存在漏洞。例如,WordPress中默认使用php序列化处理器,容易受到对象注入攻击。

    Use After Free Vulnerability

    unserialize()函数在处理DateTimeDateTimeZone对象时存在Use After Free Vulnerability(UAFV),攻击者可以利用这一漏洞泄露内存块或执行远程代码。

    PHP 自动加载机制的安全隐患

    PHP 提供了__autoload()spl_autoload_register()函数来实现类的自动加载。攻击者可以通过构造特定的序列化字符串,利用自动加载机制绕过文件上传限制,实现文件包含漏洞,进而获取远程代码执行权限。

    总结

    序列化和反序列化是PHP中核心的数据处理机制,但也伴随着多种安全风险。开发者应谨慎处理用户输入的数据,避免直接使用serialize()unserialize()函数处理未验证的外部输入。同时,应定期更新PHP版本,修复已知漏洞,并在高风险场景中采用更安全的序列化机制。

    转载地址:http://qbzkz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现更新数字指定偏移量上的值updateBit算法(附完整源码)
    查看>>
    Objective-C实现最优二叉搜索树算法(附完整源码)
    查看>>
    Objective-C实现最大和连续子序列算法(附完整源码)
    查看>>
    Objective-C实现最大最小距离算法(附完整源码)
    查看>>
    Objective-C实现最大的非常大的数字算法(附完整源码)
    查看>>
    Objective-C实现最大类间方差法OTSU算法(附完整源码)
    查看>>
    Objective-C实现最大非相邻和算法(附完整源码)
    查看>>
    Objective-C实现最小二乘多项式曲线拟合(附完整源码)
    查看>>
    Objective-C实现最小二乘法(附完整源码)
    查看>>
    Objective-C实现最小值滤波(附完整源码)
    查看>>
    Objective-C实现最小公倍数LCM算法(附完整源码)
    查看>>
    Objective-C实现最小生成树 boruvka算法(附完整源码)
    查看>>
    Objective-C实现最小编辑距离问题算法(附完整源码)
    查看>>
    Objective-C实现最小路径和算法(附完整源码)
    查看>>
    Objective-C实现最快的归并排序算法(附完整源码)
    查看>>
    Objective-C实现最短路径Dijsktra算法(附完整源码)
    查看>>
    Objective-C实现最短路径Dijsktra算法(附完整源码)
    查看>>
    Objective-C实现最短路径广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现最近点对问题(附完整源码)
    查看>>
    Objective-C实现最长公共子序列算法(附完整源码)
    查看>>