概念
序列化( serialization ):讲数据结构、对象等状态转化成可使用的格式(一般用于:缓存、网络发送、身份信息等),以备能够被还原为原始状态;
序列化 & 反序列化功能一般用作:存储、传输;
反序列化 (unserialization) :和上方相反
什么是类:
类是有相同属性和操作的一组对象的集合;
<?php
class student{
var $a=c;
echo $a;
}
?>
什么是对象:
对象是一个信息获取信息处理描述组成的整体,是对现实世界的描述;
对象是类的实例:
<?php
class student{
var $a=c;
echo $a;
}
$z=new student();
?>
完整案例:
<?php
//创建类
class student{
public $name="zhangsan";
public $age=8;
public $sex="male";
public $bul=flase;
}
//创建对象
$Student=new student();
//序列化对象
$str=serialize($Student);
//打印
echo $str;
?>
输出结果:
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 "<br>";
//序列化对象
$str=serialize($Student);
//打印
var_dump($str);
echo "<br>";
//将序列化的字符串,反序列化
$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:<obj-name-length>:<obj-name>:属性数量; 例: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 (), 对象被销毁时执行
例:
<?php
class people{
public function __sleep(){
echo "sleep";
}
public function __wakeup(){
echo "wakeup";
}
}
$People=new people();
$str=serialize($People);
$unstr=unserialize($str);
?>
反序列化+魔术函数
<?php
class pussy{
public $name='lihua';
public function __wakeup(){
eval($this->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 );