存在空密码账号:执行select host,user,authentication_string from mysql.user where length(trim(authentication_string))=0 or authentication_string in ('','')可识别,其中authentication_string为空或''表明未设密码,需立即重置或删除。

检查 MySQL 中是否存在空密码账号
MySQL 允许创建 ''(空字符串)作为密码的账号,这类账号可直接登录,属于高危配置。5.7+ 默认禁止空密码,但旧实例或手动修改过 mysql.user 表的环境仍可能存在。
执行以下查询确认:
SELECT host, user, authentication_string FROM mysql.user
WHERE LENGTH(TRIM(authentication_string)) = 0 OR authentication_string IN ('', '*');
注意:authentication_string 字段在 5.7+ 存储的是哈希值(如 *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9),若值为 '' 或 '*'(旧版未加密占位符),说明未设密码或密码为空。
-
TRIM()防止空格伪装成非空 - 不依赖
password字段(8.0 已移除) - 需以
root或具备SELECT ON mysql.*权限账号执行
识别常见弱密码哈希值(如 '123456'、'password')
MySQL 不存储明文密码,但可比对已知弱口令的哈希值。以 MySQL 5.7 默认的 caching_sha2_password 或 mysql_native_password 插件为例,其哈希逻辑固定,可预先生成常见弱口令的哈希串进行匹配。
例如,明文 '123456' 在 mysql_native_password 下哈希为 *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9,可用如下查询筛查:
SELECT host, user, plugin, authentication_string FROM mysql.user WHERE authentication_string IN ( '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', -- 123456 '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19', -- password '*AAB0484EA8719F782B12F5E181243E343312410A' -- 12345678 );
- 哈希值必须严格匹配,区分大小写
- 不同认证插件(
mysql_native_passwordvscaching_sha2_password)哈希不可混用;8.0 默认插件下,弱口令若用新插件加密,需用对应算法重算 - 生产环境建议禁用
caching_sha2_password的明文传输模式(即关闭caching_sha2_password_auto_generate_rsa_keys=OFF并配 RSA 加密)
检查匿名用户和通配符主机账号
匿名用户(user = '')和宽松主机(如 '%'、'localhost' 搭配弱密码)是横向移动常见入口。
运行:
SELECT host, user, authentication_string FROM mysql.user WHERE user = '' OR host = '%' OR (host = 'localhost' AND LENGTH(TRIM(authentication_string)) = 0);
- 匿名用户无需用户名即可登录,
SELECT结果非空即存在风险 -
host = '%'本身不危险,但若搭配空/弱密码,等于向任意 IP 开放凭证 - 部分运维脚本会创建
'root'@'localhost'但漏设密码,需单独检查
扫描后必须立即处理的三件事
查出问题账号不等于风险解除。以下操作缺一不可:
- 用
ALTER USER 'u'@'h' IDENTIFIED BY 'StrongPass!2024';强制重置密码(8.0+)或SET PASSWORD FOR 'u'@'h' = PASSWORD('...');(5.7) - 删除无用账号:
DROP USER 'u'@'h';(注意:5.7+DROP USER会同时删权限,比DELETE FROM mysql.user安全) - 刷新权限:
FLUSH PRIVILEGES;(仅当直接修改mysql.user表时必需;用ALTER USER或DROP USER则自动生效)
特别注意:MySQL 8.0.25+ 默认启用 validate_password 插件,但该插件只约束新建密码,对存量弱密码无主动告警——扫描必须人工触发,且不能依赖它替代定期审计。











