php反序列化漏洞(一)

article/2025/4/17 6:03:28

PHP反序列化漏洞就是PHP对象注入

序列化:serialize 反序列化:unserialize

序列化其实就是将数据转换成可逆的数据结构,这种数据结构可认为是字符串。可逆的过程则为反序列化。

那么序列化有什么作用?

方便储存和传输。在PHP中,序列化和反序列化一般用作缓存。

使用序列化主要是因为跨平台和对象储存的需求,因为网络上只允许字符串和二进制,而文件需要使用二进制流格式。如果想把对象储存下来,必须序列化转化为

xml json 二进制

反序列化漏洞:可以在可控的参数中输入一些恶意代码,比如<?php phpinfo()?>等对网站进行攻击。

举一个例子:

(以数组为例)

1 <?php
2 $user=array('xiao','jin','yang');
3 $user=serialize($user);
4 echo($user.PHP_EOL);
5 print_r(unserialize($user));
6 ?

则它输出的结果为:

a:3:{i:0;s:4:"xiao";i:1;s:3:"jin";i:2;s:4:"yang";}
Array
([0] => xiao[1] => jin[2] => yang
)

解读反序列化后的字符串

a (表示数组array) 3 (三个属性) i (下标) s (字符串string) 4 (长度)

   (以对象为例)

<?php
class student
{public $name = "xiaojinyang";public $age = 19;
}
$a = new student();
$b = serialize($a);
print($b);
?>

则序列化的字符串为

 O:7:"student":2:{s:4:"name";s:11:"xiaojinyang";s:3:"age";i:19;}

O (表示对象obiect)

PHP魔术方法

形式通常以两个下划线开始(__) 这些魔术方法不需要手动调用,而是出发某种特定条件自动调用。

常见的魔术方法:

__construct()方法,在创建对象时进行一些初始化操作,在创建对象时自动调用

__desctruct()方法,通常在销毁对象或脚本执行结束后自动调用,主要执行一些清理操作,比如关闭数据库连接。

__sleep()方法,在一个对象序列化时会被调用,此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。

__wakeup()方法,对储存的对象进行反序列化时会被调用,用于还原对象属性。

__toString()方法,把对象当作字符串时自动调用,把对象转化为字符串。

绕过__wakeup函数:

原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup函数。

相关题目:攻防世界  Web_php_unserialize

 进行代码审计,$this在面向对象编程中表示伪变量,是对一个对象示例的引用。它不是真正的变量,是形式上的变量。

例如:

 

<?phpClass Xiao {public $name = ' ';public $age = 0;//定义一个公共访问接口public function say($name,$age){$this->name = $name;$this->age = $age;return '我的名字是'.$this->name.'年龄是'.$this->age;}}//实例化一个对象$a = new Xiao();echo $a->say('xiao',30);
?>

可以将$this理解为对象的引用,通过引用的方式来访问一个对象的方法和属性。

解题关键:绕过__wakeup函数,有正则表达式过滤,可以O:+4来绕过正则。file变量是private变量类型


//protected属性被序列化的时候属性值会变成:%00*%00属性名
//private属性被序列化的时候属性值会变成:%00类名%00属性

另外用序列化的值进行bsae64编码

(注:要用PHP自带的base64编码函数,用在线base64编码得不到flag)

(注意:base64编码的时候,需要在脚本中一并base64,因为在记事本中进行复制的话,记事本中的格式与序列化的格式不同,自然进行base64编码后的结果也不同)

 最好用php的反序列化函数和base64加密的函数进行在线加密。

上代码:

1 $obj = new Demo('fl4g.php');
2 $str = serialize($obj);
3 $str1 = str_replace('O:4', 'O:+4',$str);//正则替换
4 $str2 = str_replace(':1:', ':2:',$str1);//绕过__wakeup函数
5 var_dump($str2);
6 var_dump(base64_encode($str2));

运行得出base64编码:

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

可以得出flag.

对序列化进行复制粘贴然后在线base可能会破坏掉类名两边的%00,具体原因不明。

总结:非常经典的题目,里面包括的知识点也很多,是对我这种萌新提升能力的好题。


http://chatgpt.dhexx.cn/article/4jVZ9SAC.shtml

相关文章

php反序列化字符逃逸

前言 在了解php反序列化漏洞后&#xff0c;我又进一步学习了字符逃逸的相关内容。这一部分相对来说是比较难理解的。我也是在网上看了很多篇文章&#xff0c;再次自己总结一下究竟什么是字符逃逸&#xff0c;也方便日后复习。 字符逃逸的原理 什么是字符逃逸&#xff0c;从字…

php反序列化[基础]

基础 概述 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组&#xff0c;字符串&#xff0c;对象等 函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() serialize()函数用于序列化对象或数组&#xff0c;并返回一个字符串 据访问修饰…

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…