php反序列化漏洞學習筆記

2021-09-25 02:38:06 字數 1785 閱讀 4398

php序列化是將乙個物件、陣列、字串等轉化為位元組流便於傳輸

php反序列化是將序列化之後的位元組流還原成物件、字元、陣列等。但是php序列化是不會儲存物件的方法。

php物件導向變成中,有一類函式叫做magic function,魔術函式,這些函式是以__(雙下劃線)開頭的,他們是一些當依照某些規則例項化類或者呼叫某些函式的時候會自動呼叫這些magic函式,這裡說一下比較常見的例如__construct,__destory,

__sleep,__wakeup,__tostring函式。

__contstruct()函式:被稱為建構函式,當例項化類的時候會自動呼叫該函式建構函式,即當物件建立new時會自動呼叫。但在反序列化時不會自動呼叫

__destruct()函式:被稱為析構函式,當類結束(物件銷毀)的時候自動呼叫該函式

__sleep()函式:當php進行序列化操作(serialize)的時候自動呼叫該函式,可以用於清理物件,並返回乙個包含物件中所有應被序列化的變數名稱的陣列。如果該方法未返回任何內容,則 null 被序列化,並產生乙個 e_notice 級別的錯誤。

__wakeup()函式:進行反序列化(unserialize)的時候自動呼叫

__tostring()函式:當物件被當做字串的時候會自動呼叫該函式

<?php

class test

public function __tostring()

}$a = new test('tom');

echo $a;

?>

輸出為tom

<?php

class test

$a = new test;

$aa = serialize($a);

print($aa)

?>

輸出結果為

o:4:"test":1:
o代表object,4代表物件名字為4個字元,test是名稱,1代表乙個變數,大括號內的s代表型別為字串型別,string。同理其他數字代表字元數。

<?php

class test

$name = 'o:4:"test":1:';

print($name);

echo "

"; $name_new = unserialize($name);

print_r($name_new);

?>

輸出結果:

o:4:「test」:1:

test object ( [name] => tom )

<?php

class test

function __destruct()

} function ping($host)

function waf($str)

function __wakeup()

}

}

$method引數傳入的是ping命令,接著通過ping本機執行sysyem命令system("ping -c 2 $host"),通過改變$host引數,而我們可以構造命令host

ping完後利用「|」管道符執行whoami命令,如下所示。

exp

$cmd = new test("ping",array("1|whoami"));

$a = serialize($cmd);

print_r($a);

serialize($a);

PHP反序列化漏洞學習

serialize將乙個物件轉換成乙個字串 unserialize將乙個字串還原成乙個物件 class people jack new people jack name jack jack age 18 jack userinfo echo serialize jack 注意點 x00 類名 x00...

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

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

PHP反序列化漏洞

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