查看文章 |
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了。 |
最近读者: