MySQL 调用 jar 包通过自定义函数实现在 MySQL 中无法实现的功能,可以使用 UDF 提权,本文详细描述配置过程,通过简单的 Demo 演示调用的过程。
概要
- UDF(user defined function)用户定义函数,用户可以通过自定义函数实现在 MySQL 中⽆法例实现的功能, 定义的新函数都可以在 SQL 语句中添加使⽤, 像调⽤ MySQL 提供的常用函数⼀样;
- 本文使用 MySQL 8.0 演示。
配置过程
- MySQL 有写入文件的权限,即 secure_file_priv 的值为空;
- 准备一个可以调用的 jar 包;
- 将 lib_mysqludf_sys.so 放入 MySQL plugins 目录下;
- 编写测试函数,调用演示效果。
secure_file_priv 配置
vi /etc/my.cnf# 增加配置
secure_file_priv=# 重启 MySQL
systemctl restart mysqld
重启后配置生效,接下来检查一下配置是否生效。
show global variables like 'secure%';
secure_file_priv 的值为空就生效啦!
准备一个 jar 包 Demo
public class SimpleApp {public static void main(String[] args) {System.out.println("Hello World");}
}
为了方便测试代码尽量简单,使用你的开发工具将其成 jar 包吧
生成 lib_mysqludf_sys.so
两种方式生成 lib_mysqludf_sys.so:
- 方式一: 自己编译 https://github.com/mysqludf/lib_mysqludf_sys
- 方式二: 使用 sqlmap 中的 lib_mysqludf_sys.so;
本文采用 sqlmap 方式演示
# 下载源码
wget https://codeload.github.com/sqlmapproject/sqlmap/zip/refs/heads/master# 解压
unzip master# 解码
python extra/cloak/cloak.py -d -i data/udf/mysql/linux/64/lib_mysqludf_sys.so_ls data/udf/mysql/linux/64/lib_mysqludf_sys.so
通过上面的步骤就可以生成 lib_mysqludf_sys.so 文件了,将其启动到 MySQL plugins 目录下。
# 先找到 plugins 目录在哪
show variables like '%plugin%';
移动文件
mv data/udf/mysql/linux/64/lib_mysqludf_sys.so /usr/lib64/mysql/plugin/# 修改文件权限
chmod +x /usr/lib64/mysql/plugin/lib_mysqludf_sys.so
编写函数测试
创建函数
# 创建函数
CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
测试效果
select sys_eval("/usr/local/bin/java -jar /usr/lib64/mysql/plugin/simple-app.jar")
输出结果:
Hello World
如果返回值为 NULL, 通常是 jar 包执行报错了。
本文链接:https://my.lmcjl.com/post/5394.html
展开阅读全文
4 评论