PHP反序列化學習

2021-10-07 01:18:01 字數 2386 閱讀 9631

利用反序列化漏洞的有兩個條件

1.unserialize()函式的引數可控

2.php中有可以利用的類並且類中有魔術函式

魔術方法就是在某些條件下自動執行的函式

序列化

<?php

$sites

=array

('google'

,'runoob'

,'facebook');

$serialized_data

=serialize

($sites);

echo

$serialized_data

.php_eol

;?>

輸出結果為:

a:3:

<?php

class

oowoo

$obj

=new

oowoo()

;$a=serialize

($obj);

echo$a;

?>

o:5:"oowoo":1:

反序列化

<?php

$str

='a:3:'

;$unserialized_data

=unserialize

($str);

print_r

($unserialized_data);

?>

輸出結果為:

array ( [0] => google [1] => runoob [2] => facebook )

__construct()//建立物件時觸發

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

__wakeup() //使用unserialize時觸發

__sleep() //使用serialize時觸發

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

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

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

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

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

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

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

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

<?php

class

test

public

function

__construct()

public

function

__destruct()

public

function

__tostring()

public

function

__sleep()

public

function

__wakeup()

}$obj

=new

test()

;//例項化物件,呼叫__construct()方法,輸出__construct

echo''

;$obj

->

echop()

;//呼叫echop()方法,輸出"abc"

echo''

;echo

$obj

;//obj物件被當做字串輸出,呼叫__tostring()方法,輸出__tostring

echo''

;$s=serialize

($obj);

//obj物件被序列化,呼叫__sleep()方法,輸出__sleep

echo''

;echo

unserialize($s

);//$s首先會被反序列化,會呼叫__wake()方法,被反序列化出來的物件又被當做字串,就會呼叫_tostring()方法。

echo''

;// 指令碼結束又會呼叫__destruct()方法,輸出__destruct

?>

輸出

__construct

abc__tostring

__sleep

__wakeup

__tostring

__destruct

__destruct

表示屬性個數的值大於真實屬性個數時,會繞過 __wakeup 函式的執行

PHP反序列化學習

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

PHP反序列化學習筆記

方法名 作用 construct 建構函式,在建立物件時候初始化物件,一般用於對變數賦初值 destruct 析構函式,和建構函式相反,在物件不再被使用時 將所有該物件的引用設為null 或者程式退出時自動呼叫 tostring 當乙個物件被當作乙個字串被呼叫,把類當作字串使用時觸發,返回值需要為字...

反序列化學習筆記

什麼是序列化,就是將物件轉換為字串。什麼是反序列化,就是將字串轉化為物件。為什麼會有序列化機制?在傳遞變數的過程中,有可能遇到變數值要跨指令碼檔案傳遞的過程。如果乙個指令碼中想要呼叫之前乙個指令碼的變數,但是之前的指令碼已經執行完畢,所有變數和內容被釋放掉了序列化與反序列化一些簡單例子 demo n...