iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php浅析反序列化结构
  • 812
分享到

php浅析反序列化结构

2024-04-02 19:04:59 812人浏览 八月长安
摘要

目录简介反序列化中常见的魔术方法反序列化绕过小Trick绕过_wakeup(CVE-2016-7124)绕过部分正则利用引用16进制绕过字符的过滤简介 序列化的目的是方便数据的传输和

简介

序列化的目的是方便数据的传输和存储,在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反序列化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: php浅析反序列化结构

本文链接: https://www.lsjlt.com/news/165261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php浅析反序列化结构
    目录简介反序列化中常见的魔术方法反序列化绕过小Trick绕过_wakeup(CVE-2016-7124)绕过部分正则利用引用16进制绕过字符的过滤简介 序列化的目的是方便数据的传输和...
    99+
    2022-11-13
  • php浅析反序列化结构知识点
    本篇文章主要给大家介绍了关于PHP的相关知识,序列化其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。php将数据序列化和反序列化会用到两个函数:serialize 将对象格式化成有序的字符串、unserialize ...
    99+
    2022-08-08
    php
  • 图文浅析Java序列化和反序列化
    序列化 序列化:将对象转换为二进制序列在网络中传输或保存到磁盘 反序列化:从网络或磁盘中将二进制序列转换为对象 注意: 对象必须实现Serializable接口 对象的所有属性都要...
    99+
    2022-11-12
  • php 反序列化总结
    果然不记笔记过一段时间就有一些东西忘了,这里给大家一个参考,如果有什么不对,希望各位师傅可以提出来。 目录 基本 序列化 serialize函数  json_encode函数 反序列化 unserialize函数 json_decode函数...
    99+
    2023-09-16
    学习 php 开发语言 经验分享
  • 深入浅析Java中的序列化与反序列化
    这篇文章将为大家详细讲解有关深入浅析Java中的序列化与反序列化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java 序列化和反序列化实例详解在分布式应用中,对象只有经过序列化才能在各个分...
    99+
    2023-05-31
    java 序列化 反序列化
  • CTF php反序列化总结
    前言:本⼈⽔平不⾼,只能做⼀些类似收集总结这样的⼯作,本篇文章是我自己在学php反序列化写的一篇姿势收集与总结,有不对的地方欢迎师傅们批评指正~ php反序列化 定义:序列化就是将对象转换成字符串。反...
    99+
    2023-08-31
    php web安全 网络安全
  • 浅析Go中序列化与反序列化的基本使用
    目录什么是序列化与反序列化序列化工作原理在Go中如何序列化一个对象如何格式化序列化后的数据如何给序列化后的xml加上属性如何将xml反序列化为一个对象什么是序列化与反序列化 这里引入...
    99+
    2023-05-16
    Go序列化 反序列化使用 Go序列化 反序列化 Go序列化 Go 反序列化
  • Think PHP 6.0.13反序列化分析
    原poc链接:https://github.com/top-think/framework/issues/2749 think PHP 6.0.13下载 composer create-project topthink/think tp p...
    99+
    2023-10-06
    php web安全
  • PHP序列化和反序列化
    一.什么是序列化和反序列化 php类与对象 类是定义一系列属性和操作的模板,而对象,就是把属性进行实例化,完事交给类里面的方法,进行处理。 `。尝试构造payload: ...
    99+
    2023-08-31
    php 开发语言
  • PHP反序列化漏洞详解(万字分析、由浅入深)
    文章目录 一、PHP面向对象编程public、protected、private魔术方法(magic函数)魔术方法在反序列化攻击中的作用 二、PHP序列化和反序列化PHP序列化PHP反序列...
    99+
    2023-10-27
    php PHP反序列化漏洞 魔术函数 mysql url
  • 浅谈phar反序列化漏洞
    目录 基础知识 前言 Phar基础 Phar文件结构 受影响的函数 漏洞实验 实验一 实验二 过滤绕过 补充 基础知识 前言 PHP反序列化常见的是使用unserilize()进行反序列化,除此之外还有其它的反序列化方法,不需要用到un...
    99+
    2023-09-09
    web安全 网络安全 php
  • PHP反序列化
    文章目录 简介POP链构造和Phar://题目[CISCN2019 华北赛区 Day1 Web1]Dropbox 字符串逃逸 简介 php序列化的过程就是把数据转化成一种可逆的数...
    99+
    2023-09-01
    php 开发语言
  • CTF-PHP反序列化
    CTFSHOW-关卡254到258-原生类&POP构造 CTF-254-对象引用执行逻辑 username=xxxxxx&password=xxxxxx 解题思路:触发vipOneKeyGetFlag这个方法,同时让方法中的判断为真才能获...
    99+
    2023-09-22
    php java 开发语言
  • Android中的序列化浅析
    序列化原因 序列化的原因基本可以归纳为以下三种情况: 1.永久性保存对象,保存对象的字节序列到本地文件中; 2.对象在网络中传递; 3.对象在IPC间传递。 序列化方法 在An...
    99+
    2022-06-06
    序列化 Android
  • PHP反序列化漏洞实例分析
    本篇内容介绍了“PHP反序列化漏洞实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、PHP面向对象编程在面向对象的程序设计(Obje...
    99+
    2023-06-29
  • PHP的session反序列化漏洞分析
    这篇文章主要讲解了“PHP的session反序列化漏洞分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP的session反序列化漏洞分析”吧!PHP session反序列化漏洞PHP ...
    99+
    2023-06-30
  • Java序列化和反序列化示例分析
    这期内容当中小编将会给大家带来有关Java序列化和反序列化示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。序列化是为了把Java对象转化为字节序列(字节流)的过程。然后深拷贝是通过对流的操作来实现的...
    99+
    2023-06-26
  • PHP的序列化和反序列化入门
    什么是PHP序列化 serialize() //将一个对象转换成一个字符串unserialize() //将字符串还原成一个对象 通过序列化与反序列化我们可以很方便的在PHP中进行对象的传递。本质上反序列化是没有危害的。但是如果...
    99+
    2023-10-27
    android
  • Python序列化与反序列化相关知识总结
    Python序列化与反序列 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict: d = dict(name='Bob', age=20, score=88) ...
    99+
    2022-11-12
  • PHP反序列化入门总结(小白必看)
    最近写了点反序列化的题,才疏学浅,希望对CTF新手有所帮助,有啥错误还请大师傅们批评指正。php反序列化简单理解首先我们需要理解什么是序列化,什么是反序列化?PHP序列化:serialize()序列化是将变量或对象转换成字符串的过程,用于存...
    99+
    2023-05-14
    反序列化 php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作