前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小记 - PHP序列化

小记 - PHP序列化

作者头像
Naraku
发布2021-07-29 10:51:49
6090
发布2021-07-29 10:51:49
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

序列化

serialize():用于序列化数组或对象,并返回一个字符串。把一个对象变成可以传输的字符串。

  • 数组序列化
代码语言:javascript
复制
<?php
    $arr = array('a', 'bb', 'ccc');
    $serialized_arr = serialize($arr);
    echo  $serialized_arr;
?>

输出如下:

  • O表示存储的是Object对象,a表示array数组,s表示string字符型,i表示int数字型
  • 3代表有3个变量
  • 花括号内:i:0表示index为0,s表示string字符型,1表示变量名的字符长度,a表示变量名
代码语言:javascript
复制
a:3:{i:0;s:1:"a";i:1;s:2:"bb";i:2;s:3:"ccc";}
# 格式化
a:3:{
    i:0;s:1:"a";
    i:1;s:2:"bb";
    i:2;s:3:"ccc";
}
  • 对象序列化
代码语言:javascript
复制
<?php
    class name1 {
        var $test1;
        var $test2;
    }
    $test3 = new name1;
    $test3->test1 = 'hi';
    $test3->test2 = 'fun';
    echo serialize($test3); 
?>

输出如下

代码语言:javascript
复制
O:5:"name1":2:{s:5:"test1";s:2:"hi";s:5:"test2";s:3:"fun";}
# 格式化
O:5:"name1":2:{
    s:5:"test1";
    s:2:"hi";
    s:5:"test2";
    s:3:"fun";
}

反序列化

unserialize()

  • 数组反序列化
代码语言:javascript
复制
<?php
    $arr = array('a', 'bb', 'ccc');
    $serialized_arr = serialize($arr);
    $unserialized_arr = unserialize($serialized_arr);
    print_r($unserialized_arr);
?>

输出

代码语言:javascript
复制
Array
(
    [0] => a
    [1] => bb
    [2] => ccc
)
  • 对象反序列化
代码语言:javascript
复制
<?php
    class temp {
        var $test1;
        var $test2;
    }
    $test3 = new temp;
    $test3->test1 = 'hi';
    $test3->test2 = 'fun';
    $serialized_obj = serialize($test3);
    $unserialized_obj = unserialize($serialized_obj);
    print_r($unserialized_obj);
?>

输出

代码语言:javascript
复制
name1 Object
(
    [test1] => hi
    [test2] => fun
)

危险魔法函数

  • 构造函数__construct():当new创建对象时会自动调用。但在unserialize()时不会自动调用
  • 析构函数__destruct():当对象被销毁时会自动调用
  • __wakeup() :当调用unserialize()函数时会自动调用
  • __sleep():当调用serialize()函数时自动调用

漏洞原理

  • 正常调用反序列化
代码语言:javascript
复制
<?php
class temp{
    var $test = '123';
}
    $obj = 'O:4:"temp":1:{s:4:"test";s:3:"123";}';
    print_r($obj);
    echo "</br>";
    
    $un_obj = unserialize($obj);
    print_r($un_obj);
    echo "</br>";
?>

输出:

代码语言:javascript
复制
O:4:"temp":1:{s:4:"test";s:3:"123";}</br>
    
temp Object(
    [test] => 123
)</br>
  • 而假如在类中重写了危险的魔法函数,则可能存在漏洞
代码语言:javascript
复制
<?php
class temp{
    var $test = '123';
    function __wakeup(){
        echo "【Wakeup】";
        echo "</br>";
    }
    function __construct(){
        echo "【construct】";
        echo "</br>";
    }
    function __destruct(){
        echo "【destruct】";
        echo "</br>";
    }
}
    $obj = 'O:4:"temp":1:{s:4:"test";s:3:"123";}';
    print_r($obj);
    echo "</br>";
    
    $un_obj = unserialize($obj);
    print_r($un_obj);
    echo "</br>";
?>

输出:为了方便观察,这里将输出格式化了一下,分成4个部分

  • 先输出print_r($obj)部分
  • 然后下面反序列化obj并赋值给un_obj时,因为调用了反序列化函数unserialize(),因此也调用了__wakeup()函数
  • 输出print_r($un_obj)的内容
  • 最后类销毁时调用了__destruct()函数
代码语言:javascript
复制
O:4:"temp":1:{s:4:"test";s:3:"123";}</br>
    
【Wakeup】</br>
    
temp Object(
    [test] => 123
)</br>
    
【destruct】</br>

漏洞利用

举个别人的例子:

代码语言:javascript
复制
<?php
class A{
    var $test = "demo";
    function __destruct(){
            echo $this->test;
    }
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>
  • 假如构造payload:http://www.xxx.com/?test=O:1:"A":1{s:4"test";s:5:"hello";},就能控制echo输出的变量

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 01 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序列化
  • 反序列化
  • 危险魔法函数
  • 漏洞原理
  • 漏洞利用
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档