您好,登錄后才能下訂單哦!
本篇內容主要講解“php反序列化結構知識點實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“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中也出過類似的考點
利用加號繞過(注意在url里傳參時+要編碼為%2B)
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
相等
O:4:“test”:2:{s:4:“%00*%00a”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}
可以寫成
O:4:“test”:2:{S:4:“\00*\00\61”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}
表示字符類型的s大寫時,會被當成16進制解析。
到此,相信大家對“php反序列化結構知識點實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。