php浅析反序列化结构

 更新时间:2022年07月26日 11:47:29   作者:哇咔哇咔哇咔哇咔  
序列化其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。php将数据序列化和反序列化会用到两个函数:serialize 将对象格式化成有序的字符串、unserialize 将字符串还原成原来的对象

简介

序列化的目的是方便数据的传输和存储,在PHP中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。

反序列化中常见的魔术方法

  1. __wakeup() //执行unserialize()时,先会调用这个函数
  2. __sleep() //执行serialize()时,先会调用这个函数
  3. __destruct() //对象被销毁时触发
  4. __call() //在对象上下文中调用不可访问的方法时触发
  5. __callStatic() //在静态上下文中调用不可访问的方法时触发
  6. __get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
  7. __set() //用于将数据写入不可访问的属性
  8. __isset() //在不可访问的属性上调用isset()或empty()触发
  9. __unset() //在不可访问的属性上使用unset()时触发
  10. __toString() //把类当作字符串使用时触发
  11. __invoke() //当尝试将对象调用为函数时触发

反序列化绕过小Trick

php7.1+反序列化对类属性不敏感

我们前面说了如果变量前是protected,序列化结果会在变量名前加上\x00*\x00

但在特定版本7.1以上则对于类属性不敏感,比如下面的例子即使没有\x00*\x00也依然会输出abc

<?php
class test{
    protected $a;
    public function __construct(){
        $this->a = 'abc';
    }
    public function  __destruct(){
        echo $this->a;
    }
}
unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');

绕过_wakeup(CVE-2016-7124)

版本:

​ PHP5 < 5.6.25

​ PHP7 < 7.0.10

利用方式:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

对于下面这样一个自定义类

<?php
class test{
    public $a;
    public function __construct(){
        $this->a = 'abc';
    }
    public function __wakeup(){
        $this->a='666';
    }
    public function  __destruct(){
        echo $this->a;
    }
}

如果执行unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');输出结果为666

而把对象属性个数的值增大执行unserialize('O:4:"test":2:{s:1:"a";s:3:"abc";}');输出结果为abc

绕过部分正则

preg_match('/^O:\d+/')匹配序列化字符串是否是对象字符串开头,这在曾经的CTF中也出过类似的考点

利用加号绕过(注意在url里传参时+要编码为%2B)

serialize(array(a ) ) ; / / a));//a));//a为要反序列化的对象(序列化结果开头是a,不影响作为数组元素的$a的析构)

<?php
class test{
    public $a;
    public function __construct(){
        $this->a = 'abc';
    }
    public function  __destruct(){
        echo $this->a.PHP_EOL;
    }
}
function match($data){
    if (preg_match('/^O:\d+/',$data)){
        die('you lose!');
    }else{
        return $data;
    }
}
$a = 'O:4:"test":1:{s:1:"a";s:3:"abc";}';
// +号绕过
$b = str_replace('O:4','O:+4', $a);
unserialize(match($b));
// serialize(array($a));
unserialize('a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}');

利用引用

<?php
class test{
    public $a;
    public $b;
    public function __construct(){
        $this->a = 'abc';
        $this->b= &$this->a;
    }
    public function  __destruct(){

        if($this->a===$this->b){
            echo 666;
        }
    }
}
$a = serialize(new test());

上面这个例子将$b设置为$a的引用,可以使$a永远与$b相等

16进制绕过字符的过滤

O:4:“test”:2:{s:4:“%00*%00a”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}

可以写成

O:4:“test”:2:{S:4:“\00*\00\61”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}

表示字符类型的s大写时,会被当成16进制解析。

到此这篇关于php浅析反序列化结构的文章就介绍到这了,更多相关php反序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows中安装Apache2和PHP4权威指南

    Windows中安装Apache2和PHP4权威指南

    Windows中安装Apache2和PHP4权威指南...
    2006-11-11
  • PHP实现的文件上传类与用法详解

    PHP实现的文件上传类与用法详解

    这篇文章主要介绍了PHP实现的文件上传类与用法,结合实例形式较为详细的分析了PHP文件上传类的定义与具体使用方法,需要的朋友可以参考下
    2017-07-07
  • 如何用PHP实现多线程编程

    如何用PHP实现多线程编程

    原以为 PHP 普遍都是单线程模型,并不适合多线程领域,发现PHP的多线程也颇有可取之处,用来解决某些问题竟然非常适合。本文对比多进程介绍了下多线程的优势和适用场景,提出了一种巧用方案,并使用PHP代码实现了多线程的常见用法。
    2021-05-05
  • php实现微信公众号主动推送消息

    php实现微信公众号主动推送消息

    这篇文章主要介绍了php实现微信公众号主动推送消息的方法,PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制,需要的朋友可以参考下
    2015-12-12
  • PHP 实现的将图片转换为TXT

    PHP 实现的将图片转换为TXT

    今天在用PHP写一个小插件的时候,遇到了一个小小的问题,就是需要将图片转换为TXT文本的内容。简单的说就是将图片转换为ASCII码,下面把代码分享给大家。
    2015-10-10
  • php基于session锁防止阻塞请求的方法分析

    php基于session锁防止阻塞请求的方法分析

    这篇文章主要介绍了php基于session锁防止阻塞请求的方法,结合实例形式分析了phpsession锁的使用及防止阻塞请求的相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 深入理解PHP中的Streams工具

    深入理解PHP中的Streams工具

    这篇文章主要介绍了PHP中的Streams工具,主要用来处理PHP中的包装类,需要的朋友可以参考下
    2015-07-07
  • php如何利用pecl安装mongodb扩展详解

    php如何利用pecl安装mongodb扩展详解

    这篇文章主要给大家介绍了关于php如何利用pecl安装mongodb扩展的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Laravel5.3+框架定义API路径取消CSRF保护方法详解

    Laravel5.3+框架定义API路径取消CSRF保护方法详解

    这篇文章主要介绍了Laravel框架定义API路径取消CSRF保护,需要的朋友可以参考下
    2020-04-04
  • PHP中register_shutdown_function函数的基础介绍与用法详解

    PHP中register_shutdown_function函数的基础介绍与用法详解

    php中的异常捕获没有java的强大,有些情况下,需要知道某段php程序业务是否正常执行完,可以用register_shutdown_function函数来辅助实现,这篇文章主要给大家介绍了关于PHP中register_shutdown_function函数的基础介绍与用法的相关资料,需要的朋友可以参考。
    2017-11-11

最新评论