pikachu PHP反序列化

2022-09-16 17:00:20 字數 1894 閱讀 2433

序列化serialize()

序列化說通俗點就是把乙個物件變成可以傳輸的字串,比如下面是乙個物件:

class

s $s=new s(); //

建立乙個物件

serialize($s); //

把這個物件進行序列化

序列化後得到的結果是這個樣子的:o:1:"

s":1:

o:代表object

1:代表物件名字長度為乙個字元

s:物件的名稱

1:代表物件裡面有乙個變數

s:資料型別

4:變數名稱的長度

test:變數名稱

s:資料型別

7:變數值的長度

pikachu:變數值

反序列化unserialize()就是把被序列化的字串還原為物件,然後在接下來的**中繼續使用。

$u=unserialize("

o:1:

"s":1:");

echo $u->test; //

得到的結果為pikachu

序列化和反序列化本身沒有問題,但是如果反序列化的內容是使用者可以控制的,且後台不正當的使用了php中的魔法函式,就會導致安全問題

常見的幾個魔法函式:

__construct()當乙個物件建立時被呼叫

__destruct()當乙個物件銷毀時被呼叫

__tostring()當乙個物件被當作乙個字串使用

__sleep() 在物件在被序列化之前執行

__wakeup將在序列化之後立即被呼叫

漏洞舉例:

class

s }

$s = $_get['

test'];

@$unser =unserialize($s);

payload:o:

1:"s

":1:

開啟pikachu靶場的反序列化,先隨便輸入一些內容

接下來我們可以先通過構造乙個payload來獲取到乙個正確的序列化後的內容,然後把正確的內容進行提交,讓後台對此內容進行反序列化,執行payload中的惡意j**ascript**,從而獲取到我們想要的資訊。

我們構造的payload為

class

secho ''

;$a=new

s();

echo serialize($a);

//輸入乙個序列化後的內容

接著我們通過瀏覽器來開啟這個payload檔案

開啟頁面源**,可以看到我們payload序列化後的內容

接著再序列化後的內容貼上到pikachu中提交成功彈窗

我們來檢視後端**後端中他定義了乙個類,在類中定義了乙個魔法方法__construct(),當這個類被建立時,它就會自動執行。而後台會去接收乙個post請求,然後對接收的資料進行反序列化,後台沒有對接收的資料做任何的過濾等安全措施。

pikachu PHP反序列化

概述 在理解這個漏洞前,你需要先搞清楚php中serialize unserialize 這兩個函式。序列化serialize 序列化說通俗點就是把乙個物件變成可以傳輸的字串,比如下面是乙個物件 class s s new s 建立乙個物件 serialize s 把這個物件進行序列化 序列化後得到...

序列化反序列化

只要用到網路開發啊,就一定會用到序列化反序列化。1,自定義結構體 struct test int len int type char data 10 test data test buffer.缺點 明文,只支援基本型別,不支援變長結構 2,在1的基礎上,自定義乙個緩衝類,存放乙個訊息。把訊息寫入緩...

序列化反序列化

using system using system.collections.generic using system.io using system.linq using system.text using system.threading.tasks namespace 序列化反序列化 syste...