天天看點

從0開始:php反序列化

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鍊來進行反序列化,進而達到攻擊。

明天講一下魔術方法