利用反序列化漏洞的有兩個條件
1.unserialize()函式的引數可控
2.php中有可以利用的類並且類中有魔術函式
魔術方法就是在某些條件下自動執行的函式
序列化
<?php
$sites
=array
('google'
,'runoob'
,'facebook');
$serialized_data
=serialize
($sites);
echo
$serialized_data
.php_eol
;?>
輸出結果為:
a:3:
<?php
class
oowoo
$obj
=new
oowoo()
;$a=serialize
($obj);
echo$a;
?>
o:5:"oowoo":1:
反序列化
<?php
$str
='a:3:'
;$unserialized_data
=unserialize
($str);
print_r
($unserialized_data);
?>
輸出結果為:
array ( [0] => google [1] => runoob [2] => facebook )
__construct()//建立物件時觸發
__destruct() //物件被銷毀時觸發
__wakeup() //使用unserialize時觸發
__sleep() //使用serialize時觸發
__call() //在物件上下文中呼叫不可訪問的方法時觸發
__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發
__get() //用於從不可訪問的屬性讀取資料
__set() //用於將資料寫入不可訪問的屬性
__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__invoke() //當指令碼嘗試將物件呼叫為函式時觸發
__tostring() //把類當作字串使用時觸發
<?php
class
test
public
function
__construct()
public
function
__destruct()
public
function
__tostring()
public
function
__sleep()
public
function
__wakeup()
}$obj
=new
test()
;//例項化物件,呼叫__construct()方法,輸出__construct
echo''
;$obj
->
echop()
;//呼叫echop()方法,輸出"abc"
echo''
;echo
$obj
;//obj物件被當做字串輸出,呼叫__tostring()方法,輸出__tostring
echo''
;$s=serialize
($obj);
//obj物件被序列化,呼叫__sleep()方法,輸出__sleep
echo''
;echo
unserialize($s
);//$s首先會被反序列化,會呼叫__wake()方法,被反序列化出來的物件又被當做字串,就會呼叫_tostring()方法。
echo''
;// 指令碼結束又會呼叫__destruct()方法,輸出__destruct
?>
輸出
__construct
abc__tostring
__sleep
__wakeup
__tostring
__destruct
__destruct
表示屬性個數的值大於真實屬性個數時,會繞過 __wakeup 函式的執行 PHP反序列化學習
在理解這個漏洞前,你需要先搞清楚php中serialize unserialize 這兩個函式。序列化serialize 序列化說通俗點就是把乙個物件變成可以傳輸的字串,比如下面是乙個物件 class s s new s 建立乙個物件 serialize s 把這個物件進行序列化 序列化後得到的結果...
PHP反序列化學習筆記
方法名 作用 construct 建構函式,在建立物件時候初始化物件,一般用於對變數賦初值 destruct 析構函式,和建構函式相反,在物件不再被使用時 將所有該物件的引用設為null 或者程式退出時自動呼叫 tostring 當乙個物件被當作乙個字串被呼叫,把類當作字串使用時觸發,返回值需要為字...
反序列化學習筆記
什麼是序列化,就是將物件轉換為字串。什麼是反序列化,就是將字串轉化為物件。為什麼會有序列化機制?在傳遞變數的過程中,有可能遇到變數值要跨指令碼檔案傳遞的過程。如果乙個指令碼中想要呼叫之前乙個指令碼的變數,但是之前的指令碼已經執行完畢,所有變數和內容被釋放掉了序列化與反序列化一些簡單例子 demo n...