PHP反序列化漏洞學習

2022-06-29 10:42:07 字數 2918 閱讀 6388

serialize將乙個物件轉換成乙個字串

unserialize將乙個字串還原成乙個物件

<?php 

class people

}$jack = new people();

$jack -> name = 'jack';

$jack -> age = 18;

$jack -> userinfo();

echo serialize($jack);

?>

注意點:\x00 + 類名 + \x00 + 變數名 反序列化出來的是private變數\x00 + * + \x00 + 變數名 反序列化出來的是protected變數

來個反序列化:

來個私有屬性的反序列化

__wakeup() //使用unserialize時觸發

__sleep() //使用serialize時觸發

__destruct() //物件被銷毀時觸發

__call() //在物件上下文中呼叫不可訪問的方法時觸發

__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發

__get() //用於從不可訪問的屬性讀取資料

__set() //用於將資料寫入不可訪問的屬性

__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發

__unset() //在不可訪問的屬性上使用unset()時觸發

__tostring() //把類當作字串使用時觸發

__invoke() //當指令碼嘗試將物件呼叫為函式時觸發

最常見的幾個

__construct,建構函式,php 5 允行開發者在乙個類中定義乙個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初 始化工作。 

__tostring,列印乙個物件時,如果定義了__tostring()方法,就能在測試時,通過echo 列印物件體,物件就會自動呼叫它所屬類定義的tostring方法,格式化輸出這個物件所包含 的資料。

__destruct,析構函式,php 5 引入了析構函式的概念,這類似於其它物件導向的語言, 如 c++。析構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷毀時執行。

__sleep magic方法在乙個物件被序列化的時候呼叫。

__wakeup magic方法在乙個物件被反序列化的時候呼叫。

php反序列化漏洞又叫php物件注入漏洞,反序列化的資料本質上來說是沒有危害的,但是在 反序列化引數可控時,可能會產生嚴重的安全威脅。當傳給 unserialize() 的引數可控時, 我們可以通過傳入乙個精心構造的序列化字串,從而控制物件內部的變數甚至是函式。

<?php 

class flag

}unserialize($_post['pop']);

highlight_file(__file__);

可以發現unserialize的引數是可控的,並且在__wakeup函式裡面會呼叫system函式,引數是類中的屬性

通過反序列化,我們可以達到控制類的屬性的操作

攻擊流程就是在本地寫乙個序列化的檔案,拿得到的字串去打遠端

//類都照抄

$flag = new flag();

$flag -> cmd = $_get['cmd'];

echo serialize($flag);

得到payload=o:4:"flag":1:

拿這個payload去打遠端,成功控制引數從而命令執行

重點關注的函式:

**執行:eval() assert()

命令執行:exec() passthru() system() popen()

檔案操作:file_put_contents() file_get_contents() unlink()

掃瞄器:

php反序列漏洞 例項 PHP反序列化漏洞

雖然胳膊廢了,也不能停止我更新的腳步。寫個簡單點的吧 0x00 何為類和物件 說到序列化和反序列化就不得不提到兩個詞 類和物件 那麼什麼是類,什麼是物件 教科書式的答案是類是物件的抽象,物件是類的例項 那啥叫個抽象,啥叫個例項呢 簡單的說,類就是物件的乙個標準模板,而物件就是按照模板做出來的實物 一...

PHP反序列化漏洞

序列化簡單利用 serialize 序列化 使用函式serialize 可將例項序列化為字串 unserialize 反序列化 使用函式unserialize 可將序列化的字串還原 示例 class example unserialize get code 漏洞利用 構造漏洞利用的 儲存為test....

PHP反序列化漏洞

前幾天安恆月賽兩道web題中有一道題是關於php反序列化的,然後剛好前幾天剛好看過這個知識點,於是乎這次比賽才沒有爆零,總算是寫出來了一道題 doge 所有php裡面的值都可以使用函式serialize 來返回乙個包含位元組流的字串來表示。unserialize 函式能夠重新把字串變回php原來的值...