1.為什麼要反序列化:
将一個對象轉換為位元組資料,位元組資料可以在WEB端傳輸,服務端接收後對其反序列化,以還原對象的狀态。
簡單來說就是序列化是為了讓服務端接收對象,然後再将其反序列化為原來的狀态。
2.主要函數:
`序列化:serialize`
反序列化:unserialize
3.可序列化的·資料類型
a-array
b-boolean
d-double
i-integer
s-non-escaped binary string
S-escaped binary string
c-custom object
o-class
n-null
4.簡單的序列化展示
<?php
echo serialize('admin');
?>
//輸出:s:5:"admin";
其中:s代表資料類型,5代表資料長度,引号内的·即為序列化的字元串,由此可見序列化後的字元每一個都有其特殊的含義。為此我們展開以下内容:序列化一個對象
<?php
class Xino{
public $name = "wuhu";
}
echo serialize(new xino);
?>
//輸出:O:4:"Xino":1:{s:4:"name";s:4:"wuhu";}
//O對應CLASS ,4為CLASSNAME名字,1代表成員個數 ,括号對的即為成員的内容
5.私有屬性被保護屬性靜态屬性序列化後的特征
A.
private(私有屬性)
舉上面的例子,我們隻修改屬性為private
<?php
class Xino{
private $name = "wuhu";
}
echo serialize(new xino);
?>
//輸出:O:4:"Xino":1:{s:10:"Xinoname";s:4:"wuhu";}
與上面不同之處在于成員變量名字前面加了一個CLASSNAME
但看到10,我們發現有兩個不可見字元,對其urlencode
B。被保護屬性
protected同樣的:
<?php
class Xino{
protected $name = "wuhu";
}
echo serialize(new xino);
?>
//輸出:O:4:"Xino":1:{s:7:"*name";s:4:"wuhu";}
//同樣urlencode
//%00*%00
C。靜态屬性
static:
<?php
class Xino{
static $name = "wuhu";
}
echo serialize(new xino);
?>
//輸出:
//O:4:"Xino":0:{}
靜态屬性比較特殊,序列化後沒有任何屬性,因為靜态成員變量不可以被序列化和反序列化
D.總結
我們可以通過函數反序列化成員變量,但是不能反序列化對象的方法。
5.反序列化(unserialize)
說完序列化的基礎,我們再看反序列化
<?php
$a = "xino";
$b = serialize($a);
var_dump(unserialize($b));
?>
//輸出:string(4) "xino"
由此可見反序列化将序列化的資料還原了,對此,我們發現可以構造poc鍊來進行反序列化,進而達到攻擊。
明天講一下魔術方法