php反序列化结构知识点实例分析

蜗牛 互联网技术资讯 2022-07-29 18 0

本篇函数内容主要讲解“php反序列化结构知识点实例分析魔术”,php序列化对照表,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php反序列化结构知识点实例分析”吧!

php反序列化结构知识点实例分析  php 第1张

简介

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

反序结构列化中常解决见的魔术方法方法

  • __wakeup() //执行unserialize()时,php反序列化怎么解决,先会用的生成调用实例这个函数

  • __sleep() //执行serialize()时,php反序列化魔术方法,先会调用原理这个函数

  • __destruct() //对象被销毁时触发利用

  • __call() //在对象上下文中调用不可反序访问的方法时魔术触发

  • __callStatic() //在静态上下文中php调用不可访问的方法时触发

  • __get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法

  • __set() //用于将数据写入不可格式访问的属性

  • __isset() //在操作不可实例访问的属性上教程调用isset()或empty()触发漏洞

  • __unset() //在不可访问的属性上使用unset()时触发

  • __toString() //把类当作字符串使用时触发

  • __invoke() //当尝伪试将对象调用为函数时触发

反序官方用的列化函数绕过知识点知识点小Trick

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

我们前解决面说了如果变量前是protected,php反序列化利用的伪协议,序列化结果方法会在变量名前加上\x00*\x00

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

<?php
class test{
    protected $a;
    public function __construct(){
        $this-详解伪>a = 'abc';
    }
    public function  __destruct(){
        echo $this->a;
    }
}
Phpunserialize('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;
    }
}

如果执行Phpunserialize('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+实例开发交流示例/')匹配序列化字符串是否是对象字符串开头详解,这在曾经的伪phpCTF中解释也出过类似的考点

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

漏洞Phpserialize(array(a ) ) ; / / a));//a));//a为要反序列化的对象(序列化结果规范开头是a,php反序列化函数,Php反序列化,不过程影响作为框架数组元素的$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',序列化和反序列化php,'O:+4',php序列化函数,php反序列化结构知识点实例分析, $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的操作函数引用哪种实例分析,php反序列化原理,可以使$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反序列化结构知识点实例分析”有了更深的了解,不妨来实际操作学习一番吧!这里是蜗牛博客网站,更多相关内容可以进入相关频道进行查询,关注我们,继续序列化学习!

免责声明:本站发布的内容(图片、视频和官方文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,php反序列化,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论