在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;`创建一个指向共享库文件的自定义