直接查 mysql.user 表的 authentication_string 字段可精准定位空密码和弱密码账号:用 length(trim(authentication_string)) = 0 或 in ('', '') 筛空密码,结合插件类型匹配预计算哈希值(如 6bb4837... 判定 '123456'),并核查 password_expired 和 password_last_changed 以评估综合风险。

直接查 mysql.user 表的 authentication_string 字段就能定位空密码和弱密码账号,不需要猜、不用翻日志,但必须用 root 或具备 SELECT ON mysql.* 权限的账号执行。
查空密码和伪装空密码的账号
MySQL 5.7+ 已废弃 password 字段,只认 authentication_string。空字符串 ''、占位符 '*'、或仅含空格的值都算“无密”——攻击者可直连登录。
-
TRIM(authentication_string)必须加,否则' '(一个空格)会被漏掉 - 别用
= ''简单判断,要配合LENGTH(TRIM(...)) = 0 - 语句示例:
SELECT host, user, plugin, authentication_string FROM mysql.user WHERE LENGTH(TRIM(authentication_string)) = 0 OR authentication_string IN ('', '*');
识别弱密码哈希值(精准匹配)
哈希值本身不暴露明文,但 MySQL 认证插件(如 mysql_native_password)哈希逻辑固定,可预计算常见弱口令的哈希串做比对。混用插件哈希会完全失准。
- 先确认目标用户用的插件:
SELECT user, host, plugin FROM mysql.user WHERE authentication_string IN ('*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'); - 只查对应插件的用户,例如:
SELECT host, user, plugin FROM mysql.user WHERE plugin = 'mysql_native_password' AND authentication_string IN ('*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'); -
caching_sha2_password下的'123456'哈希是 72 位 Base64 SHA256,不能拿上面 41 位值去比
删账号前必须验证本地管理通道是否存活
批量 DROP USER 很快,但删完发现唯一能连上的 root@'%' 被干掉了,就真锁死自己了。
- 执行前先确认至少有一个强密码的本地账号可用,比如
'root'@'127.0.0.1'或'dba'@'localhost' - 不要直接
DROP USER ''@'localhost',先SELECT确认存在且非唯一管理入口 - 删除后必须执行
FLUSH PRIVILEGES;,否则缓存权限仍生效 - 建议先导出当前用户列表:
mysqldump --no-data mysql user > user_backup_$(date +%Y%m%d).sql
为什么只改密码不够,还得看 password_last_changed 和策略
一个账号密码是强的,但如果 password_expired = 'Y' 或 validate_password.policy 是 LOW,它实际仍处于风险敞口。
- 查过期状态:
SELECT user, host, password_expired, password_last_changed FROM mysql.user WHERE password_expired = 'Y' OR password_last_changed - 检查密码策略是否启用:
SHOW VARIABLES LIKE 'validate_password%';,重点看validate_password.length是否 ≥ 12 - 禁用宽松策略:
SET GLOBAL validate_password.policy = 'MEDIUM'; SET GLOBAL validate_password.length = 12;
真正麻烦的不是查出几个弱密码账号,而是那些 authentication_string 长度为 1~30 的账号——它们大概率对应原始密码是 ''、'1'、'a' 这类超短口令,但哈希值又不在常用表里,得人工介入重置。











