在Linux系統環境中,MySQL數據庫的UDF(User Defined Function,用戶自定義函數)提權是一種經典且高效的攻擊手段
本文將深入探討MySQL Linux UDF提權的原理、條件、步驟及防范措施,旨在提高讀者的安全意識與防護能力
一、UDF提權原理 UDF,即用戶自定義函數,是MySQL數據庫的一個拓展接口,允許用戶創建自定義函數,以便在SQL查詢語句中使用
這些函數可以執行復雜的計算或數據處理任務,極大地增強了MySQL的靈活性和功能性
然而,這一特性也可能被攻擊者利用,通過編寫調用cmd或shell的共享庫文件(在Windows中為.dll文件,在Linux中為.so文件),并將其導入到指定的文件夾目錄下,創建一個指向該共享庫文件的自定義函數
這樣,在數據庫中的查詢就等價于在cmd或shell中執行命令,從而實現提權
二、提權條件 要實現MySQL Linux UDF提權,必須滿足以下條件: 1.高權限MySQL賬號:攻擊者需要擁有一個具有增刪改查權限的MySQL賬號,最好是root賬號
這個賬號應能對MySQL數據庫執行create、insert、delete等操作
2.secure_file_priv參數為空:MySQL的secure_file_priv參數用于限制load data、select - into outfile、load_file()等函數只能在特定目錄進行
當secure_file_priv為空時,表示不對MySQL的導入/導出做限制,此時可進行UDF提權
若secure_file_priv為null,則限制MySQL不允許導入/導出;若secure_file_priv為特定目錄(如/tmp/),則限制MySQL的導入/導出只能發生在該目錄下,此時無法進行UDF提權
3.創建函數的目錄存在:對于MySQL版本大于等于5.1的系統,創建函數的目錄是plugin
若該目錄不存在,則無法進行UDF提權
因此,攻擊者需確保MySQL安裝目錄下的lib/plugin文件夾存在(該文件夾默認不存在,需自行創建)
三、提權步驟 MySQL Linux UDF提權的步驟大致如下: 1.查詢MySQL版本與系統信息: -使用`select version();`查詢MySQL版本
-使用`show VARIABLES LIKE %compile%;`查詢系統位數
-使用`show VARIABLES LIKE %secure%;`查詢secure_file_priv參數的值
-使用`show VARIABLES LIKE %plugin%;`查詢plugin目錄的位置
2.準備共享庫文件: - 攻擊者需編寫一個可以調用cmd或shell的共享庫文件(.so文件),并將其上傳到目標系統
這通常通過漏洞利用、webshell或其他遠程連接手段實現
3.創建臨時表并導入共享庫文件: - 在MySQL數據庫中創建一個臨時表,用于存儲共享庫文件的二進制內容
例如,使用`CREATE TABLEtemp_udf(udf LONGBLOB);`創建一個名為temp_udf的表,其中包含一個類型為LONGBLOB的列udf
- 將共享庫文件寫入到該表中
例如,使用`INSERT INTOtemp_udf (udf)VALUES (CONVERT(十六進制編碼的共享庫文件內容));`將共享庫文件的內容插入到表中
注意,這里需要將共享庫文件的二進制內容轉換為十六進制編碼
4.導出共享庫文件到指定目錄: -使用`SELECT unhex(udf) FROM temp_udf INTO DUMPFILE /usr/lib/mysql/plugin/raptor_udf2.so;`將共享庫文件導出到MySQL的plugin目錄下
注意,這里需要將`/usr/lib/mysql/plugin/`替換為實際的plugin目錄路徑,并將`raptor_udf2.so`替換為實際的共享庫文件名
5.創建自定義函數并執行系統命令: -使用`CREATE FUNCTIONdo_system RETURNS INTEGER SONAME raptor_udf2.so;`創建一個指向共享庫文件的自定義