[Vulhub](WooYun-2016-199433)phpmyadmin反序列化漏洞
0x00 預備知識
什么是序列化
- 序列化 (serialize)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。【將狀態(tài)信息保存為字符串】
- 簡單的理解:將PHP中 對象、類、數(shù)組、變量、匿名函數(shù)等,轉(zhuǎn)化為字符串,方便保存到數(shù)據(jù)庫或者文件中
- 當在php中創(chuàng)建了一個對象后,可以通過serialize()把這個對象轉(zhuǎn)變成一個字符串,保存對象的值方便之后的傳遞與使用。
什么是反序列化
- 序列化就是將對象的狀態(tài)信息轉(zhuǎn)為字符串儲存起來,那么反序列化就是再將這個狀態(tài)信息拿出來使用。(重新再轉(zhuǎn)化為對象或者其他的)【將字符串轉(zhuǎn)化為狀態(tài)信息】
- 與 serialize() 對應的,unserialize()可以從已存儲的表示中創(chuàng)建PHP的值
反序列化漏洞
- 本質(zhì)上serialize()和unserialize()在PHP內(nèi)部實現(xiàn)上是沒有漏洞的,漏洞的主要產(chǎn)生是由于應用程序在處理對象、魔術(shù)函數(shù)以及序列化相關問題的時候?qū)е碌摹?/li>
- 當傳給 unserialize() 的參數(shù)可控時,那么用戶就可以注入精心構(gòu)造的payload。當進行反序列化的時候就有可能會觸發(fā)對象中的一些魔術(shù)方法,造成意想不到的危害。
魔術(shù)方法
php中有一類特殊的方法叫“Magic function”(魔術(shù)方法), 這里我們著重關注一下幾個:
- __construct():當對象創(chuàng)建(new)時會自動調(diào)用。但在unserialize()時是不會自動調(diào)用的。(構(gòu)造函數(shù))
- __destruct():當對象被銷毀時會自動調(diào)用。(析構(gòu)函數(shù))
- __wakeup():如前所提,unserialize()時會自動調(diào)用。
- __toString():方法用于一個類被當成字符串時應怎樣回應。例如 echo $obj;應該顯示些什么。
0x01 環(huán)境搭建
漏洞環(huán)境:https://vulhub.org/#/environments/phpmyadmin/WooYun-2016-199433/
啟動環(huán)境
- 1
查看當前運行漏洞環(huán)境
- 1
本地訪問沒問題,環(huán)境搭建成功(因為沒有連接到數(shù)據(jù)庫,我們將得到一個錯誤。但此漏洞與數(shù)據(jù)庫無關,因此請忽略)
0x02 影響范圍
phpmyadmin 2.8.0.3
0x03 漏洞成因
通過 exec 命令對指定的容器執(zhí)行 bash然后查看源碼:
sudo docker exec -it 53b9559d9612 /bin/bash- 1
也可以下載到本地查看,更方便:
- 1
查看存在漏洞的文件代碼 /scripts/setup.php
發(fā)現(xiàn)當configuration傳參存在且action傳參不為’clear’時,將傳入的connfiguration給反序列化;而setup.php中又引入了common.lib.php,接下來查看common.lib.php:
common.lib.php中又引入了Config.class.php,接下來看Config.class.php:
Config.class.php中含有__wakeup()魔術(shù)方法,因此可以構(gòu)造序列化參數(shù),其中又調(diào)用了load()方法,接下來繼續(xù)看load方法:
整體思路就是:
- 1
0x04 漏洞復現(xiàn)
構(gòu)造payload修改source的值后得到的序列化值作為configuration的傳參,就可以輸出任意文件內(nèi)容
poc:
- 1
注意需要滿足兩個條件:1. POST請求方法;2. action的傳參不為clear:
復現(xiàn)結(jié)束后別忘了關閉docker容器:
- 1
經(jīng)過分析這個漏洞是不能讀取php文件的,而因為又了eval()函數(shù),相當于任意文件包含了。getshell需要包含上傳的木馬文件,也可以包含日志。但docker環(huán)境中并未開啟日志功能,也沒有上傳點,因此getshell比較困難。
在Ubuntu下一般不允許root權(quán)限運行,無法讀取access.log。在windows下幾乎所有瀏覽器和python模塊都會將特殊字符編碼進行轉(zhuǎn)換,getshell就更困難了,只能用socket去構(gòu)造shell,參考下面這篇文章:
https://docs.ioin.in/writeup/www.mottoin.com/4cb63e7c-9151-42da-a5bd-e6e29e7ff2f8/index.html(pma任意文件包含導致代碼執(zhí)行)
參考鏈接:
https://docs.ioin.in/writeup/www.mottoin.com/4cb63e7c-9151-42da-a5bd-e6e29e7ff2f8/index.html(pma任意文件包含導致代碼執(zhí)行)
https://www.cnblogs.com/ichunqiu/p/10484832.html(PHP反序列化漏洞利用總結(jié))
總結(jié)
以上是生活随笔為你收集整理的[Vulhub](WooYun-2016-199433)phpmyadmin反序列化漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: routersploit简单实例
- 下一篇: PHPcms框架的Webshell