有时候为了方便,利用event/trigger调用系统外部命令,可因为安全问题,mysql自身并没有提供相关命令,这里提供个调用系统命令的自定义函数mylab_sys_exec
so文件下载:mylab_sys_exec.so ( mysql5.1.34 测试通过)
加载:
CREATEFUNCTIONmylab_sys_exec RETURNS INTEGERSONAME"mylab_sys_exec.so";
使用:
SELECTmylab_sys_exec('CMD');
源码:
my_bool mylab_sys_exec_init(UDF_INIT *initid, UDF_ARGS *args,char*message);voidmylab_sys_exec_deinit(UDF_INIT *initid);intmylab_sys_exec(UDF_INIT *initid, UDF_ARGS *args,char*is_null,char*error);
my_bool mylab_sys_exec_init(UDF_INIT *initid, UDF_ARGS *args,char*message){if(args->arg_count ==1&& args->arg_type[0]==STRING_RESULT){return0;}else{strcpy(message,"One string type parameter expected"); return1;}}
voidmylab_sys_exec_deinit(UDF_INIT *initid){}
intmylab_sys_exec(UDF_INIT *initid , UDF_ARGS *args ,char*is_null ,char*error){returnsystem(args->args[0]);}
hi.baidu.com/isno
Marco Ivaldi 几年前曾经发表过一个 raptor_udf2.c,演示了如何利用mysql udf入侵系统,但是这个mysql udf也演示了一个调用系统命令的方式。但是这一插件目前应经不能兼容mysql 5.0+,主要是已经不符合新的mysql udf的规范了,并且没有返回结果。
mysql User-Defined Functions 是 Roland Bouman 开发的一个新的调用系统命令的udf包,其中有三个函数:
sys_exec: 调用系统命令,执行外部程序
sys_get: 返回系统环境变量的值
sys_set: 设置系统环境变量
这一mysql udf 包是兼容mysql 5.0+ ,同时支持linux和windows。但是这一包也有一个问题,执行命令后返回是命令的exit_code ,而不是命令的执行结果。
Bernardo Damele A. G. 针对这一问题做了一个更新包,增加了一个sys_eval函数,这一函数命令执行成功返回执行结果,而如果错误返回NULL。
这里下载补丁: here
lib_mysqludf_sys version 0.0.2 在这里下载 here.
使用实例:
$ wget --no-check-certificate https://svn.sqlmap.org/sqlmap/trunk/sqlmap/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz
$ tar xfz lib_mysqludf_sys_0.0.3.tar.gz
$ cd lib_mysqludf_sys_0.0.3
$ sudo ./install.sh
Compiling the mysql UDF
gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/lib_mysqludf_sys.so
mysql UDF compiled successfully
Please provide your mysql root password
Enter password:
mysql UDF installed successfully
$ mysql -u root -p mysql
Enter password:
[...]
mysql> SELECT sys_eval('id');
+--------------------------------------------------+
| sys_eval('id') |
+--------------------------------------------------+
| uid=118(mysql) gid=128(mysql) groups=128(mysql) |
+--------------------------------------------------+
1 row in set (0.02 sec)
mysql> SELECT sys_exec('touch /tmp/test_mysql');
+-----------------------------------+
| sys_exec('touch /tmp/test_mysql') |
+-----------------------------------+
| 0 |
+-----------------------------------+
1 row in set (0.02 sec)
mysql> exit
Bye
$ ls -l /tmp/test_mysql
-rw-rw---- 1 mysql mysql 0 2009-01-16 23:18 /