PHP反序列化漏洞

2022-04-12 00:43:17 字數 2007 閱讀 8578

php程式為了儲存和轉儲物件,提供了序列化的方法,php序列化是為了在程式執行的過程中對物件進行轉儲而產生的。序列化可以將物件轉換成字串,但僅對保留物件裡的成員變數,不保留函式方法。

<?php 

class ctf';

public $name='cxk';

public $age='18';

}$ctfer=new ctf();

$ctfer->flag='flag';

$ctfer->name='zesiar0';

$ctfer->age='19';

echo serialize($ctfer);

?>    

輸出:

o:代表是物件;

3:代表物件有3個字元;

ctf:代表物件的名稱;

3:代表物件中有三個成員;

第乙個變數序列化後為s:4:"flag";s:10:"flag"

其中分號左邊代表的是變數的名稱,右邊代表的是變數的值

注意:在php中會對類中不同屬性的變數進行不同的修飾

public屬性:如上圖所示

protected屬性:在變數名前加上%00*%00

private屬性:在變數名前加上%00類名%00

<?php 

class test

$test = new test();

$test1 = serialize($test);

$test2 = unserialize($test1);

echo $test1."

";var_dump($test2);

?>

執行結果:

可以看到成員變數都被還原了

_construct 當乙個物件建立時被呼叫

_destruct 當乙個物件銷毀時被呼叫

_tostring 當乙個物件被當作乙個字串使用

_sleep 在物件被序列化之前執行

_wakeup 在物件被反序列化之後被呼叫

例項:

test2.php的**

<?php 

class test

function __wakeup()

function __sleep()

}$test = new test();

$test1 = serialize($test);

?>

ctf.php的**

<?php 

include 'test2.php';

class ctf';

protected $name = 'cxk';

private $age = '18';

}$ctfer = new ctf();

echo serialize($ctfer);

$test2 = unserialize('o:4:"test":3:');

?>    

執行結果:

可以看出在test2.php中先建立了乙個物件,然後呼叫了__construct()函式,之後有序列化函式,所以先呼叫了

__sleep()函式,然後對$test進行序列化操作。而在ctf.php中先建立了乙個$ctfer物件,再對$ctfer進行序列化操作然後輸出,這裡可以明顯的看出public,protected和private屬性的不同。之後又有反序列化函式,所以呼叫了

__wakeup()函式,返回值為成員變數的新值。

$test2 = unserialize('o:4:"test":4:');

這裡就要用到cve-2016-7124漏洞,當序列化字串中表示物件屬性個數的值大於真實的屬性個數時會跳過__wakeup的執行

這裡__wakeup()函式就被成功跳過了

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

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

PHP反序列化漏洞

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

PHP反序列化漏洞

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