如何通过MySQL查询检测数据库中是否存在无密码或弱密码的账户?

2026-04-29 01:173阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计860个文字,预计阅读时间需要4分钟。

如何通过MySQL查询检测数据库中是否存在无密码或弱密码的账户?

MySQL 允许创建字符串(空字符串)作为密码的用户账户,此类账户可直接登录。这类账户属于高风险配置(默认禁止空密码,但旧实例或手动修改过`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_passwordmysql_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_password vs caching_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 USERDROP USER 则自动生效)

特别注意:MySQL 8.0.25+ 默认启用 validate_password 插件,但该插件只约束新建密码,对存量弱密码无主动告警——扫描必须人工触发,且不能依赖它替代定期审计。

标签:Mysql

本文共计860个文字,预计阅读时间需要4分钟。

如何通过MySQL查询检测数据库中是否存在无密码或弱密码的账户?

MySQL 允许创建字符串(空字符串)作为密码的用户账户,此类账户可直接登录。这类账户属于高风险配置(默认禁止空密码,但旧实例或手动修改过`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_passwordmysql_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_password vs caching_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 USERDROP USER 则自动生效)

特别注意:MySQL 8.0.25+ 默认启用 validate_password 插件,但该插件只约束新建密码,对存量弱密码无主动告警——扫描必须人工触发,且不能依赖它替代定期审计。

标签:Mysql