本篇文章主要為大家介紹了關於PHP的相關知識,序列化其實就是將資料轉化成一種可逆的資料結構,自然,逆向的過程就叫做反序列化。 php將資料序列化和反序列化會用到兩個函數:serialize 將物件格式化成有序的字串、unserialize 將字串還原成原來的對象,希望對大家有幫助。
(推薦教學:PHP影片教學)
序列化的目的是方便資料的傳輸和存儲,在PHP中,序列化和反序列化一般用做緩存,例如session緩存,cookie等。
__wakeup() //執行unserialize()時,先會呼叫這個函數
__sleep() //執行serialize()時,先會呼叫這個函數
#__destruct() //物件被銷毀時觸發
__call() //在物件上下文中呼叫不可存取的方法時觸發
#__callStatic() //在靜態上下文中呼叫不可存取的方法時觸發
__get() //用於從不可存取的屬性讀取資料或不存在這個鍵都會呼叫此方法
__set() / /用於將資料寫入不可存取的屬性
__isset() //在不可存取的屬性上呼叫isset()或empty()觸發
__unset() //在不可存取的屬性上使用unset()時觸發
#__toString() //把類別當作字串使用時觸發
__invoke() //當嘗試將物件呼叫為函數時觸發
php7 .1 反序列化對類別屬性不敏感
我們前面說瞭如果變數前是protected,序列化結果會在變數名稱前加上\x00*\x00
#但在特定版本7.1以上則對於類別屬性不敏感,例如下面的範例即使沒有\x00*\x00
也依然會輸出abc
<?php class test{ protected $a; public function __construct(){ $this->a = 'abc'; } public function __destruct(){ echo $this->a; } } unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');
版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
##利用方式:序列化字串中表示物件屬性個數的值大於真實的屬性個數時會跳過__wakeup的執行對於下面這樣一個自訂類別<?php class test{ public $a; public function __construct(){ $this->a = 'abc'; } public function __wakeup(){ $this->a='666'; } public function __destruct(){ echo $this->a; } }
unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');輸出結果為
666
unserialize('O:4:"test":2:{s:1:"a";s:3:"abc"; }');輸出結果為
abc
#preg_match('/^O:\d /')匹配序列化字串是否是物件字串開頭,這在曾經的CTF中也出過類似的考點
serialize(array(a ) ) ; / / a));//a));//a為要反序列化的物件(序列化結果開頭是a,不影響作為陣列元素的$a的析構)
<?php class test{ public $a; public function __construct(){ $this->a = 'abc'; } public function __destruct(){ echo $this->a.PHP_EOL; } } function match($data){ if (preg_match('/^O:\d+/',$data)){ die('you lose!'); }else{ return $data; } } $a = 'O:4:"test":1:{s:1:"a";s:3:"abc";}'; // +号绕过 $b = str_replace('O:4','O:+4', $a); unserialize(match($b)); // serialize(array($a)); unserialize('a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}');
<?php class test{ public $a; public $b; public function __construct(){ $this->a = 'abc'; $this->b= &$this->a; } public function __destruct(){ if($this->a===$this->b){ echo 666; } } } $a = serialize(new test());
$b設定為
$a的引用,可以使
$a永遠與
$b相等
以上是php淺析反序列化結構知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!