概念
序列化(
serialization
):讲数据结构、对象等状态转化成可使用的格式(一般用于:缓存、网络发送、身份信息等),以备能够被还原为原始状态;
序列化
&
反序列化功能一般用作:存储、传输;
反序列化
(unserialization)
:和上方相反
什么是类:
类是有相同属性和操作的一组对象的集合;
什么是对象:
对象是一个信息获取信息处理描述组成的整体,是对现实世界的描述;
对象是类的实例:
完整案例:
输出结果:
O:7:"student":3:{s:4:"name";s:8:"zhangsan";s:3:"age";i:8;s:3:"sex";s:4:"male";}
O
表示
object
,
数字
7
表示
‘student’
的长度,数字
3
表示属性数量,大括号内
{
s
表示
‘string’
;
4
表示字符串长度,
‘name’
表示名称
}
<?php
//创建类
class student{
public $name="zhangsan";
public $age=8;
public $sex="male";
public $bur=false;
public $gir=1.111;
public $arr=array('a','b','c');
private $name2="zhangsan";
protected $name3="zhangsan";
}
//创建对象
$Student=new student();
var_dump($Student);
echo "
";
//序列化对象
$str=serialize($Student);
//打印
var_dump($str);
echo "
";
//将序列化的字符串,反序列化
$unstr=unserialize($str);
//打印
var_dump($unstr);
?>
object(student)#1 (8) { ["name"]=> string(8) "zhangsan" ["age"]=> int(8)
["sex"]=> string(4) "male" ["bur"]=> bool(false) ["gir"]=> float(1.111) ["arr"]=>
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
["name2":"student":private]=> string(8) "zhangsan" ["name3":protected]=>
string(8) "zhangsan" }
string(230) "O:7:"student":8:
{s:4:"name";s:8:"zhangsan";s:3:"age";i:8;s:3:"sex";s:4:"male";s:3:"bur";b:0;s:3:
"gir";d:1.111;s:3:"arr";a:3:
{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}s:14:"studentname2";s:8:"zhangsan";s:8:"*n
ame3";s:8:"zhangsan";}"
object(student)#2 (8) { ["name"]=> string(8) "zhangsan" ["age"]=> int(8)
["sex"]=> string(4) "male" ["bur"]=> bool(false) ["gir"]=> float(1.111) ["arr"]=>
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
["name2":"student":private]=> string(8) "zhangsan" ["name3":protected]=>
string(8) "zhangsan" }
常见数据类型序列化后样式:
bool-------->b:value 例:s:3:"bul";b:0;=========>$bul=false
string------->s:count:value 例: s:4:"qwer";s:4:"qwer"; =========>$qwer=qwer
int---------->i:value 例:s:2:"in";i:8; ========>$in=8
Object------->O:::属性数量; 例:O:3:"res":2:
array-------->a:3:{i:0;i:1;i:1;i:2;i:2;i:34}============>array(1,2,34)
private
属性序列化后格式:
%00
类型
%00
成员名;
protected
属性序列化后格式:
%00*%00
成员名;
public
属性无特例
;
php7.1+
反序列化的类属性不敏感;
魔术函数:
php
中自定的功能、方法;
php
中魔术方法以
‘——’,
两个下划线开头,魔术函数无需调用,只需要满足特定条件即可触发;
__wakeup
()
,反序列化时被执行
__sleep
()
,序列化时被执行
__construct
(),
对象被创建时执行
__destruct
(),
对象被销毁时执行
例:
反序列化+魔术函数
name);
}
}
$a=$_GET['a'];
unserialize($a);
?>
用户可操作参数传入序列化字符串,且被反序列化函数处理
payload:
O:5:"pussy":1:{s:4:"name";s:10:"phpinfo();";}
反序列化漏洞成因:
①有
unserialize&serialize
,
②魔法函数;
③用户控制输入;
php
反序列化常见于
ctf
代码审计中;
java
反序列化常见于组件、框架(
weblogic
、
shrio
、
struct2
);