提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助檔案
文章目錄
- 一、什么是反序列化漏洞?
- 1.序列化與反序列化
- 2.反序列化漏洞
- 二、PHP反序列化漏洞
- 1.php中必須出現反序列化的原因
- 2.序列化和反序列化的函式
- 3.php反序列化漏洞示例(PHP物件注入漏洞)
- 4.PHP反序列化漏洞分析
- 5.補充
- 二、Java反序列化漏洞
- 1.引發
- 2.原因
- 3.根源
- 學習資料
- 三、反序列化漏洞的防御?
一、什么是反序列化漏洞?
1.序列化與反序列化
序列化即將物件轉化為位元組流,便于保存在檔案,記憶體,資料庫中;反序列化即將位元組流轉化為物件,也就是說,把資料轉化為一種可逆的資料結構,再把這種可逆的資料結構轉化回資料,這就是序列化與反序列化,
比如,買一個柜子,從北京運到上海,由于柜子形狀怪異,不方便運輸,先把它拆成板子,再裝到箱子里(序列化),順豐郵到買家手里,把板子拼裝回柜子(反序列化),
2.反序列化漏洞
①反序列化漏洞的產生原理,即黑客通過構造惡意的序列化資料,從而控制應用在反序列化程序中需要呼叫的類方法,最終實作任意方法呼叫,如果在這些方法中有命令執行的方法,黑客就可以在服務器上執行任意的命令,
②各種語言都有反序列化漏洞,
二、PHP反序列化漏洞
1.php中必須出現反序列化的原因
①大型網站中類創建的物件多的時候會占用大量的空間
②部分組態檔通過序列化進行檔案存盤或者傳遞,然后再進行物件化會比較方便,一次采用序列化存盤資料,
2.序列化和反序列化的函式
①.serialize()
當在PHP中創建了一個物件后,可以通過serialize()把這個物件轉變成一個字串,保存物件的值之后方便之后的傳遞與使用
②.unserialize()
與serialize()對應,unserialize()可以從已存盤的表示中創建PHP的值,可以從序列化后的結果中恢復物件(object)
例如:
<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');
//序列化陣列
$s = serialize($a);
echo "序列化:",$s,"<br>";
//反序列化陣列
$aa = unserialize($s);
echo "反序列化:",$aa,"<br>";
print_r($aa);
?>
運行結果為:
a:3:{s:1:“a”;s:5:“Apple”;s:1:“b”;s:6:“banana”;s:1:“c”;s:7:“Coconut”;}
陣列:3個物件:{1個字串型別a;5個字串型別Apple;以此類推}

3.php反序列化漏洞示例(PHP物件注入漏洞)
①存在檔案1.php如下:
<?php
class Test{
var $test = "123";
//__wakeup() 如果有,在反序列化之前呼叫
function __wakeup(){
$fp = fopen("test.php", 'w');
fwrite($fp, $this -> test);//把test變數寫入test.php檔案中
fclose($fp);
}
}
$test1 = $_GET['test'];//頁面url傳參
print_r($test1);//輸出引數
echo "<br />";
$seri = unserialize($test1);//反序列化引數
require "test.php"; //運行寫入的檔案
?>
②構造payload
一個Test類,有一個test引數,test="<?php phpinfo();?>":
O:4:"Test":1:{s:4:"test";s:18:"<?php%20phpinfo();?>";}
③打開php頁面時在地址欄傳入引數:
1.php?test=O:4:"Test":1:{s:4:"test";s:18:"<?php%20phpinfo();?>";}
可以創建一個test.php檔案,并把Test類中的test變數的值即"<?php phpinfo();?>" 寫進了test.php檔案,最后運行:

再比如:
<?php
class Test1{
function __construct($test){
$fp = fopen("shell.php", "w");
fwrite($fp, $test);
fclose($fp);
}
}
class Test2{
var $test = "123";
function __wakeup(){
$obj = new Test1($this -> test);
}
}
$test = $_GET['test'];
unserialize($test);
require "shell.php";
?>
4.PHP反序列化漏洞分析
1.出現的原因:
①unserialize()傳入引數可控
②存在某些魔術方法可用
__construct()當一個物件創建時被呼叫
__destruct()當一個物件銷毀時被呼叫
__toString()當一個物件被當作一個字串時使用
__sleep() 在物件在被序列化之前運行
__wakeup() 如果有,在反序列化之前呼叫
③沒有過濾或者過濾不完善
2.防御:
在反序列化函式內部添加正則過濾,以防構造payload進行攻擊
5.補充
https://www.cnblogs.com/bmjoker/p/13742666.html
https://www.cnblogs.com/bmjoker/p/13831713.html
二、Java反序列化漏洞
1.引發
如果Java應用對用戶輸入,即不可信資料做了反序列化處理,那么攻擊者可以通過構造惡意輸入,讓反序列化產生非預期的物件,非預期的物件在產生程序中就有可能帶來任意代碼執行,
2.原因
類ObjectInputStream在反序列化時,沒有對生成的物件的輸入做限制,使攻擊者利用反射呼叫函式進行任意命令執行,CommonsCollections組件中對于集合的操作存在可以進行反射呼叫的方法
3.根源
Apache Commons Collections允許鏈式的任意的類函式反射呼叫
問題函式:org.apache.commons.collections.Transformer介面
學習資料
https://www.cnblogs.com/ssooking/p/5875215.html
三、反序列化漏洞的防御?
對于反序列化漏洞的防御,我們主要考慮兩個方面:認證和檢測,對于面向內部的介面和服務,我們可以采取認證的方式,杜絕它們被黑客利用的可能,另外,我們也需要對反序列化資料中的呼叫鏈進行黑白名單檢測,成熟的第三方序列化插件都已經包含了這個功能,暫時可以不需要考慮,最后,如果沒有過多的性能考量,我們可以通過 RASP 的方式,來進行一個更全面的檢測和防護,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356906.html
標籤:其他
