您好,登錄后才能下訂單哦!
本篇內容介紹了“PHP反序列化的概念和用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
序列化:主要是將變量進行轉換,使其變為字符串,序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。在程序執行結束時,內存數據便會立即銷毀,變量所儲存的數據便是內存數據,而文件、數據庫是“持久數據”,因此PHP序列化就是將內存的變量數據“保存”到文件中的持久數據的過程。方便保存和傳輸,并且可以達到節省空間的目的
反序列化:主要是在特定的時候將序列化轉換為字符串的內容再轉換為原來的變量繼續使用,簡單來理解起來就是將序列化過存儲到文件中的數據,恢復到程序代碼的變量表示形式的過程,恢復到變量序列化之前的結果。
PHP反序列化的相關函數主要是:serialize()和unserialize()
其中serialize()可以將變量轉換為字符串,并且在轉換的過程中保存當我變量的值
而unserialize()2可以將serialize()轉換的字符串再轉換為變量
主要包括:類,變量,方法,對象(如下圖)
__construct 當一個對象創建時被調用,
__destruct 當一個對象銷毀時被調用,
__toString 當一個對象被當作一個字符串被調用。
__wakeup() 使用unserialize時觸發
__sleep() 使用serialize時觸發
__destruct() 對象被銷毀時觸發
__call() 在對象上下文中調用不可訪問的方法時觸發
__callStatic() 在靜態上下文中調用不可訪問的方法時觸發
__get() 用于從不可訪問的屬性讀取數據
__set() 用于將數據寫入不可訪問的屬性
__isset() 在不可訪問的屬性上調用isset()或empty()觸發
__unset() 在不可訪問的屬性上使用unset()時觸發
__toString() 把類當作字符串使用時觸發,返回值需要為字符串
__invoke() 當腳本嘗試將對象調用為函數時觸發
<?php class User { public $age = 0; public $name = ''; public function PrintData() { echo 'User '.$this->name.'is'.$this->age.'years old. <br />'; } } //創建一個對象 $user = new User(); // 設置數據 $user->age = 20; $user->name = 'daye'; //輸出數據 $user->PrintData(); //輸出序列化之后的數據 echo serialize($user); ?>
O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}
對象類型:長度:"類名":類中變量的個數:{類型:長度:"值";類型:長度:"值";......}
反序列化
<?php class User { public $age = 0; public $name = ''; public function PrintData() { echo 'User '.$this->name.' is '.$this->age.' years old. <br />'; } } //重建對象 $user = unserialize('O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}'); $user->PrintData(); ?>
<?php class test{ public $varr1="abc"; public $varr2="123"; public function echoP(){ echo $this->varr1."<br>"; } public function __construct(){ echo "__construct<br>"; } public function __destruct(){ echo "__destruct<br>"; } public function __toString(){ return "__toString<br>"; } public function __sleep(){ echo "__sleep<br>"; return array('varr1','varr2'); } public function __wakeup(){ echo "__wakeup<br>"; } } $obj = new test(); //實例化對象,調用__construct()方法,輸出__construct $obj->echoP(); //調用echoP()方法,輸出"abc" echo $obj; //obj對象被當做字符串輸出,調用__toString()方法,輸出__toString $s =serialize($obj); //obj對象被序列化,調用__sleep()方法,輸出__sleep echo unserialize($s); //$s首先會被反序列化,會調用__wake()方法,被反序列化出來的對象又被當做字符串,就會調用_toString()方法。 // 腳本結束又會調用__destruct()方法,輸出__destruct ?>
當出現PHP反序列化漏洞的時候,首先我們可以將想要輸入的變量使用serialize()進行序列化,如:O:1:"S":1:{s:4:"test";s:28:"<img src=x onerror=alert(1)>";}
其次,將序列化之后的字符串放到url中。在PHP代碼中使用了unserialize(),則會自動執行特定的魔法函數,如果魔法函數中有其他的一些危險函數且是我們可控的,即可進行其他操作。
“PHP反序列化的概念和用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。