zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP反序列化详解(一)——反序列化基础

PHP基础 详解 序列化
2023-09-14 09:01:43 时间

今天继续给大家介绍渗透测试相关知识,本文主要内容是PHP反序列化详解(一)——反序列化基础。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、反序列化概念

在编程开发时,我们会经常使用一些字符串、数字、类等类型的变量或者结构,这些在编程中非常常见。但是如果我们要在多个设备之间传递这些变量,则显得比较麻烦。为了方便在不同设备之间这些数据的传输,我们经常会使用序列化和反序列化操作。
序列化是指将一个变量转化为一个字符串的过程,而反序列化则是序列化的逆过程,即将序列化后的字符串再转化为变量的过程。

二、PHP反序列化实现

在PHP中,序列化需要使用serialize()函数,而返序列化则需要使用unserialize()函数。下面,我们简单的用一个例子,来展示这两个函数的作用。PHP代码如下所示:

<?php
$param1="Hello World!";
class cl1{
	public $param1=1;
	public $param2="param2";
}
$a=new cl1();
$str1=serialize($param1);
$str2=serialize($a);
echo($str1);
echo('<br>');
echo($str2);
?>

上述代码执行结果如下所示:
在这里插入图片描述
从上例中可以看出,serialize()函数可以将一个变量转化为一个字符串,相应的,unserialize()函数则可以将一个序列化后的字符串再转化为变量。

三、PHP反序列化结果解析

下面,我们来解析以下PHP反序列化后的结果。以上例中输出的类序列化结果为例:

O:3:"cl1":2:{s:6:"param1";i:1;s:6:"param2";s:6:"param2";}

最开始的O,表示变量的类型是一个对象类型的变量,后面使用冒号分隔,之后的3表示该变量值的长度为3,再后面的"cl1"表示这个对象的值,再后面的2表示该对象里面有2个变量。大括号例的是对象中变量的信息。用分号分隔两个变量名称和变量值。s表示字符串,i表示整数类型,后面的数字大多都代表长度,再后面跟的是该变量名称或者是变量值。
其他类型PHP反序列化可以查阅下表:

类型结构
strings:size:value;
integeri:value;
boolenb:value;
nullN;
arraya:size:{【key定义(参考以上四种)】;【value定义(参考以上四种)】;……}
ObjectO:ObjectNameLength:ObjectName:ObjectParamSize:{【每个变量定义(参考以上四种)】……}

原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200