PHP反序列化漏洞總結(一)

2022-09-07 13:21:07 字數 3198 閱讀 7477

做了不少php反序列化的題了,是時候把坑給填上了。參考了一些大佬們的部落格,自己再做一下總結

在了解序列化和反序列化之前,先簡單了解一下php的物件導向。

萬物皆可物件。根據官方手冊,php中,以關鍵字class定義乙個類,乙個類可以包含有屬於自己的常量,變數(稱為「屬性」)以及函式(稱為「方法」)。

class

people

}

現在已經定義好了乙個類,接下來用關鍵字new來例項化這個類

$people_1 = new

people();  //例項化物件

$people_1->name = '張三';  //屬性賦值

$people_1->eat();      //呼叫方法

<?php 

class

people

}$people_1 = new

people();

$people_1->name = '張三';

根據官方手冊,所有php裡面的值都可以使用函式serialize()來返回乙個包含位元組流的字串來表示。unserialize()函式能夠重新把字串變回php原來的值。 序列化乙個物件將會儲存物件的所有變數,但是不會儲存物件的方法,只會儲存類的名字。emmmm。。。。個人理解其實就是為了解決php在執行當前指令碼需要跨指令碼檔案傳遞某些變數內容時,但因為之前指令碼執行完後把內容釋放掉從而無法獲取的問題。serialize可以將變數轉換為字串,並且在轉換的過程中可以儲存當前變數的值,而unserialize則可以將serialize生成的字串轉換回變數。

根據之前的例子,再新增個age屬性

<?php 

class

people

}$people_1 = new

people();

$people_1->name = '張三';

$people_1->age = 18;

$people_1->eat();  

//序列化

o:6:"people":2:就是當前people_1這個物件序列化後的形式。"o"表示物件,「6」表示物件所屬的類長度為6,「people」為類名,「2」表示有2個引數。「{}」裡面是引數的key和value,s:4:"name"表示這個引數的string型別,長度為4,key值是name。後面以此類推,i表示int型別

然後反序列化這段,新建乙個檔案test2.php

<?php 

class

people}//

重建物件

$usr = unserialize('o:6:"people":2:');

//輸出

$usr->eat();

?>

效果:

其實吧,個人感覺序列化和反序列化就類似於訪問陣列。舉個不恰當的例子,就像積木,序列化乙個把搭建好後的積木收拾好,反序列化就是把收拾好的積木再按照原來的圖紙搭起來。接下來說到的反序列化漏洞就類似於把原來的積木換了個顏色,某塊積木形狀對的但顏色不對,按照圖紙搭起來就是感覺違和。

了解了什麼是序列化和反序列化後,是時候研究一下php反序列化漏洞了,實際上,php反序列化漏洞利用的條件在實際環境中比較苛刻,但是如果可以利用一般都會產生很嚴重的後果

1.unserialize函式的引數可控

2.所寫的內容需要有物件中的成員變數的值

3.指令碼中存在乙個建構函式(__construct())、析構函式(__destruct())、__wakeup()函式中有向php檔案中寫資料的操作的類

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

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

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

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

__wakeup將在序列化之後立即被呼叫所寫的內容需要有物件中的成員變數的值

這裡先借大佬的舉個的例子(後續再填坑)

建立test3.php

<?php 

class

test

}$test1 = $_get['test'];

print_r($test1

);echo "

";$seri = unserialize($test1

);require "test.php";

?>

先盲目分析一波,test這類有個重寫的__wakeup()這個魔術方法,當序列化後,開啟test.php,許可權為寫,將$test值重寫到test.php,用get方式將值傳入$test1,然後反序列化。就是我們如果傳入乙個序列化後的exp傳入,text.php就會變成我們出傳入內容

當值為空時,訪問http://本地環境/test3.php?test=  

根據剛剛的方法,新建乙個指令碼,序列化一下

然後我們跟上引數 o:4:"test":1:

發現不但頁面更改了而且連原檔案都被重寫了,這時乙個php反序列化漏洞就產生了

(目前只是簡單總結,實戰方面先挖個坑,後續再補)

如有錯誤還請指出,謝謝

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

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

PHP反序列化漏洞

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

PHP反序列化漏洞

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