unserialize反序列化漏洞的原理與挖掘

當(dāng)在php中創(chuàng)建了一個(gè)對象后,可以通過 serialize() 函數(shù)把這個(gè)對象轉(zhuǎn)變成一個(gè)字符串,保存對象的值方便之后的傳遞與使用。

image.png

與 serialize() 對應(yīng)的就是反序列化函數(shù) unserialize() ,它可以將一個(gè)字符串轉(zhuǎn)變?yōu)橄鄬?yīng)的php對象。

image.png

其實(shí)本質(zhì)上來說,serialize() 和 unserialize() 在 PHP內(nèi)部實(shí)現(xiàn)上是沒有漏洞的,之所以會產(chǎn)生反序列化漏洞是因?yàn)閼?yīng)用程序在處理對象、魔術(shù)函數(shù)以及序列化相關(guān)問題的時(shí)候?qū)е碌摹?/p>

當(dāng)傳給 unserialize() 的參數(shù)可控時(shí),那么用戶就可以注入精心構(gòu)造的 payload。當(dāng)進(jìn)行反序列化的時(shí)候就有可能會觸發(fā)對象中的一些魔術(shù)方法,造成意想不到的危害。

這里簡單說一下魔術(shù)方法。"Magic Function" 是 php 中一類特殊的方法。這里我們著重關(guān)注以下幾個(gè):

  • __construct():當(dāng)對象創(chuàng)建(new)時(shí)會自動調(diào)用。但在 unserialize() 時(shí)是不會自動調(diào)用的。(構(gòu)造函數(shù))
  • __destruct():當(dāng)對象被銷毀時(shí)會自動調(diào)用。(析構(gòu)函數(shù))
  • __wakeup():unserialize() 時(shí)會自動調(diào)用。

下面結(jié)合代碼可以更好的理解:

image.png
image.png

下面來看一下很簡單的存在反序列化漏洞的例子:

image.png

由于 unserialize() 的參數(shù)可控,我們就,且chybeta類的對象在被銷毀時(shí),會執(zhí)行 $this->test->action 方法,它的 $this->test 我們也可以控制。所以我們可以構(gòu)造如下代碼來生成經(jīng)過序列化后的 poc:

image.png

于是,我們就成功構(gòu)造了一句話木馬:

image.png

知道了漏洞的原理和利用方式之后,下面就來實(shí)戰(zhàn)一把。

訪問靶場地址:

image.png

填點(diǎn)東西,提交表單:

image.png

點(diǎn)擊超鏈接“Check Code”,頁面上打印出了 index.php 的源碼:

image.png

來分析下代碼。首先看HTML的部分,其中會通過php的foreach循環(huán)來遍歷$todos遍歷的內(nèi)容,并以無序列表的形式顯示在頁面上。

然后看一下表單處理的部分,首先獲取textarea提交的文本,存儲到數(shù)組變量 $todos 中,然后對 $todos 進(jìn)行序列化并存入變量 $m中,

再對 $m進(jìn)行md5加密,加密后的內(nèi)容存到變量 $h中,最后將 $h和$m拼接起來作為 Cookie todos的值,然后重定向到當(dāng)前頁面。

接著,獲取Cookie中 todos的值,分別取出$h和 $m的值,比較兩者是否相等,如果相等,則將$m的值進(jìn)行反序列化,并將結(jié)果存到變量$todos,最終在下面的foreach循環(huán)中顯示在頁面上。

再往上看,有一個(gè)叫 readme的類,該類中重寫了魔術(shù)方法 __toString(),如果用echo 打印該類的對象,則內(nèi)容就是Readme.txt 和 成員變量 $this->source 的內(nèi)容的拼接。

image.png

而且可以看到,成員變量可以控制。因此可以按照上面代碼中對Cookie的處理邏輯,構(gòu)造好包含著能反序列化為 readme 對象的字符串,然后放到Cookie中去訪問http://120.203.13.75:8123/uns/index.php ,就能講 flag.php的內(nèi)容打印到頁面上。

于是,在本地構(gòu)造php程序,sez.php 如下:

image.png

訪問結(jié)果如下:

image.png

再次訪問 http://120.203.13.75:8123/uns/index.php, 然后利用Firefox的Cookie Quick Manager 插件,修改Cookie中todos的值為上面得到的結(jié)果:

image.png

保存設(shè)置后的值,然后刷新頁面,flag.php的內(nèi)容就顯示在了頁面上:

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • php對象注入是一個(gè)非常常見的漏洞,這個(gè)類型的漏洞雖然有些難以利用,但仍舊非常危險(xiǎn)。為了理解這個(gè)漏洞,請讀者具備基...
    BerL1n閱讀 3,696評論 0 2
  • 0x01 概述 什么是php反序列化漏洞呢?簡單的來說,就是在php反序列化的時(shí)候,反序列化的內(nèi)容是用戶可控,那么...
    Pino_HD閱讀 4,660評論 4 8
  • 2018/3/16 17:34:51 WEB題 1.簽到題 題目:key在哪里? writeup:查看源代碼即可獲...
    Sec小玖閱讀 22,607評論 1 11
  • 星期四,陰轉(zhuǎn)晴。 早上九點(diǎn),穿著休閑運(yùn)動裝,農(nóng)貿(mào)市場買菜。一位擺地?cái)偟馁u菜老婆婆問我:“你今天沒有上學(xué)嗎?”我第一...
    木里兮閱讀 680評論 0 1
  • 你面前的那架綠蘿 看起來有些枯黃 或許是缺了雨水 或許是少了陽光 總之多了憂傷 你面前的那架綠蘿 曾...
    晏米閱讀 209評論 0 2

友情鏈接更多精彩內(nèi)容