直接查 mysql.user 表的 authentication_string 字段可快速识别弱口令:trim 长度为 0 表示空密码;值为 '*' 是旧版未设密占位符;插件为 mysql_native_password 且哈希长度异常也属高危。

直接查 mysql.user 表的 authentication_string 字段
不用登录 phpMyAdmin 界面,也不用爆破或连外部工具,只要能执行 SQL(比如通过 phpMyAdmin 的【SQL】标签页),就能立刻判断。关键不是“密码能不能猜中”,而是 MySQL 自己已经把弱口令线索明文写在系统表里了。
必须用具备 SELECT ON mysql.* 权限的账号(通常是 root)执行,否则查不到 mysql.user。注意:password 字段在 MySQL 8.0+ 已彻底移除,查它只会返回空或报错。
-
TRIM(authentication_string)长度为 0 → 空密码,可免密登录 -
authentication_string值为'*'→ 旧版未设密占位符,同样高危 - 插件是
mysql_native_password,但哈希长度 '*1'、'*0')→ 原始密码极大概率是''、'1'、'0'这类单字符
执行这句即可初筛:
SELECT host, user, plugin, authentication_string FROM mysql.user WHERE LENGTH(TRIM(authentication_string)) = 0 OR authentication_string IN ('', '*') OR (plugin = 'mysql_native_password' AND LENGTH(authentication_string)
<h3>比对预计算哈希值确认常见弱口令</h3>
<p>MySQL 的哈希算法是确定的,<code>'123456'</code> 在 <code>mysql_native_password</code> 下永远是 <code>'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'</code>。所以不用解密、不靠运气,直接拿已知哈希去匹配就行。</p>
<p>重点:不同认证插件哈希不可混用。查 <code>caching_sha2_password</code> 用户时,不能拿上面那个 41 位值去比——它的哈希是 72 位 Base64 编码的 SHA256,格式完全不同。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a>
<p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 只查
mysql_native_password用户:SELECT host, user FROM mysql.user WHERE plugin = 'mysql_native_password' AND authentication_string IN ('*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'); -
'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'是'password'的哈希 - 如果想覆盖更多,可本地用
SELECT PASSWORD('xxx')(MySQL 5.7)或SELECT SHA2('xxx', 256)+ Base64 编码(caching_sha2_password)生成哈希列表
别漏掉“静默弱口令”:结合时间戳和策略字段
有些账号哈希看着正常(41 位),但实际早已沦为风险源——比如密码三年没换过,且 validate_password_policy 被设成 LOW 或 0,那当初设的 'Abc123' 早被跑库撞穿了。
这类隐患不会体现在哈希长度或值上,得交叉验证:
- 查过期状态:
SELECT user, password_expired, password_last_changed FROM mysql.user WHERE password_expired = 'Y' OR (password_last_changed IS NOT NULL AND password_last_changed - 查策略宽松:
SHOW VARIABLES LIKE 'validate_password%';—— 如果validate_password_policy是LOW或0,且validate_password_length≤ 6,基本等于放行弱口令 -
password_reuse_history和password_reuse_time为 0 也意味着允许无限复用旧密码
phpMyAdmin 里执行这些语句要注意什么?
在 phpMyAdmin 的【SQL】页执行上述查询,最常踩的坑不是语法错,而是权限和上下文限制:
- 默认可能没开
mysql库的 SELECT 权限 → 先确认当前账号能否展开左侧的mysql数据库,点进去看有没有user表 - phpMyAdmin 对长结果会截断,尤其哈希值 → 建议加
LIMIT 20,或导出为 CSV 再分析 - 某些低版本 phpMyAdmin(如 4.8.x)对
TRIM()支持不稳定 → 可改用authentication_string = '' OR authentication_string = '*'先抓最明显的 - 执行
SHOW VARIABLES类语句时,phpMyAdmin 可能不显示结果集 → 换成SELECT @@validate_password_policy;这种形式更可靠
真正难的不是查出来,而是查出来之后要不要动、怎么动。比如发现一个 host='%' and user='admin' 的空密码账号,删它之前得先确认业务是否真依赖这个配置——很多老系统硬编码了这个凭据,直接删会导致服务中断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










