今天继续给大家介绍渗透测试相关知识,本文主要内容是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反序列化可以查阅下表:
类型 | 结构 |
---|---|
string | s:size:value; |
integer | i:value; |
boolen | b:value; |
null | N; |
array | a:size:{【key定义(参考以上四种)】;【value定义(参考以上四种)】;……} |
Object | O:ObjectNameLength:ObjectName:ObjectParamSize:{【每个变量定义(参考以上四种)】……} |
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200