mysql匿名用户必须立即删除,因其是无需用户名即可登录的高危后门;需三步彻底清除:删除所有空用户、清理mysql.db中对应权限、执行flush privileges重载。

MySQL匿名用户必须立刻删除,它不是“没名字的用户”,而是“不用名字就能登录”的后门。
为什么空用户名比弱密码还危险
匿名用户(User = '')在 SELECT User, Host FROM mysql.user 中肉眼难发现——空字符串容易被跳过;但它匹配优先级极高,PHP 里写 mysqli_connect('localhost', '', '') 常能直连成功,而命令行 mysql -u "" -p 却失败,这种不一致性让漏洞更隐蔽。
- 默认常拥有对
test库的ALL PRIVILEGES,可直接建大表占满磁盘
學院
- 若具备
FILE权限(旧版默认开启),攻击者可通过SELECT '=system($_GET[1])?>' INTO OUTFILE '/var/www/html/shell.php'写入 Webshell - 若
Grant_priv = 'Y',一条CREATE USER 'attacker'@'%' IDENTIFIED BY 'x'; GRANT ALL ON *.* TO 'attacker'@'%';就彻底失守
删错一步就白干:三步缺一不可
只执行 DROP USER ''@'localhost' 不够,旧版本权限残留、内存未刷新都会导致风险继续生效。
- 先删主账号:
DROP USER ''@'localhost'; DROP USER ''@'127.0.0.1'; DROP USER ''@'::1';(IPv6别漏) - 再清库级权限(尤其
test):DELETE FROM mysql.db WHERE User = '';(DROP USER不动mysql.db) - 最后强制重载:
FLUSH PRIVILEGES;——不执行这句,所有删除在内存中都不生效
删完还会回来?防复发的关键动作
备份恢复、初始化脚本重装、甚至某些 Docker 镜像启动时,都可能把匿名用户带回来。
- 安装后第一件事必须跑:
mysql_secure_installation,它会自动删匿名用户、禁用root@%、删test库 - 禁止任何人在
GRANT或CREATE USER时省略用户名,比如GRANT SELECT ON db.* TO '@localhost'是非法但可能被忽略的写法 - 把检查语句加入运维巡检脚本:
SELECT User, Host FROM mysql.user WHERE User = '';,结果非空即告警
最常被忽略的是第二步——删了用户却没清 mysql.db 表,导致任意用户仍能访问 test 库。这不是“删得不够狠”,是 MySQL 权限模型本身分层设计决定的,绕不开。










