百度空间 | 百度首页 
 
查看文章
 
mysql中隐藏的匿名用户危机
2008-12-08 01:47
mysql的权限分配过程中,会用到“mysql“数据库中的user、host和db这三个重要的权限表。通过user这个表可以知道具有mysql权限的用户到底是哪些。如果我们够仔细地话,往往能够发现user表中竟然存在有一些匿名用户。比如,在我的ubuntu上装的mysql中就有这样的用户:

mysql> select * from user\G;
*************************** 4. row ***************************
                 Host: localhost
                 User:
             Password:
          Select_priv: N
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
          Reload_priv: N
        Shutdown_priv: N
         Process_priv: N
            File_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
         Show_db_priv: N
           Super_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
         Execute_priv: N
      Repl_slave_priv: N
     Repl_client_priv: N
     Create_view_priv: N
       Show_view_priv: N
Create_routine_priv: N
   Alter_routine_priv: N
     Create_user_priv: N
             ssl_type:
           ssl_cipher:
          x509_issuer:
         x509_subject:
        max_questions: 0
          max_updates: 0
      max_connections: 0
max_user_connections: 0

再来看看这个匿名用户拥有的数据表权限:
mysql> select * from db\G;
*************************** 1. row ***************************
                 Host: %
                   Db: test
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
*************************** 2. row ***************************
                 Host: %
                   Db: test\_%
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
也就是说,用匿名用户登录,可以拥有test数据库以及以test_作为前缀的数据库的所有权限。

接下来,尝试一下匿名用户带来的乐趣:
直接输入mysql,如果有设定默认用户为root的话,可能会提示
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

不过不要紧,可以尝试给-u指定为空字符串:
mysql -u‘’
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 132698
Server version: 5.0.67-enterprise-gpl-log Source

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

mysql> create table foo(id varbinary(600000));
Query OK, 0 rows affected, 1 warning (0.06 sec)

哈哈,一路下来竟然畅通无阻。虽然这个匿名用户不能干预其他表的操作,但是它却可以在test中插入大量的数据,占用大量磁盘空间,增加系统的负担和风险。另外,对于information_schma表的权限也能让它对别的数据库结构等有足够的了解,无疑会给系统的运行带来新的潜在危险。

总而言之,多一事不如少一事,还是将此等匿名用户删之为妙。不过,删除的时候貌只将user和db中和匿名用户有关的记录删掉并没有产生实质性的变化,比如:
mysql> delete from user where user='';
mysql> delete from db where user='';
这样虽然把相应记录删除掉,可是匿名用户依然可以登录。真正管用的还是drop user:
mysql> drop user ''@localhost;
经过这样的步骤以后,匿名用户终于登录不进mysql了。

类别:技术追峰 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu