MySQL被入侵的典型迹象包括网站异常、访问变慢、数据消失或出现陌生账号;排查需按日志、账号、权限、网络行为四层逐项验证,重点查异常登录、高危账号、恶意SQL及公网暴露。

发现网站异常、访问变慢、数据莫名消失或出现陌生账号,MySQL很可能已被入侵。排查不是靠猜,而是按线索逐层验证——重点看日志、账号、权限和网络行为。
查异常登录和连接记录
攻击者常反复尝试登录或建立大量空连接。先确认通用日志是否开启:
-
检查状态:执行
SHOW VARIABLES LIKE 'general_log%';,若值为 OFF,说明默认不记所有操作;可临时开启:SET GLOBAL general_log = 'ON'; -
快速筛查可疑登录:运行
SELECT * FROM mysql.general_log WHERE argument LIKE '%Access denied%' OR command_type = 'Connect' ORDER BY event_time DESC LIMIT 50;,重点关注短时间高频失败、陌生 IP 或非常规时段的连接 -
结合系统日志:Linux 下查看
/var/log/auth.log或/var/log/secure,搜索mysql、3306或大量Failed password记录
核对用户账号与权限配置
很多入侵从弱口令或冗余账号开始。直接进库查最真实:
-
列出所有账号:执行
SELECT User, Host FROM mysql.user;,重点识别test、''@'%'(空用户名)、root@'%'这类高危组合 -
检查权限滥用:对每个非必要账号运行
SHOW GRANTS FOR 'username'@'host';,特别警惕含FILE、SHUTDOWN、GRANT OPTION或ALL PRIVILEGES的授权 -
查是否有后门账号:留意用户名含特殊符号(如
admin_123、backdoor)、Host 为%却无业务需求的条目
扫描异常SQL与数据变动
黑客常通过注入或提权写入恶意语句、清空表、导出敏感字段。需结合多类日志交叉比对:
-
慢查询日志里找暴力痕迹:开启后查看
slow-query.log,过滤执行时间极短却频繁出现的SELECT ... FROM mysql.user、UNION SELECT、LOAD_FILE等语句 -
错误日志中定位破坏动作:执行
SHOW VARIABLES LIKE 'log_error';找到错误日志路径,打开后搜索DROP TABLE、TRUNCATE、CREATE FUNCTION、SELECT @@version等典型操作 -
检查触发器与自定义函数:运行
SELECT * FROM mysql.func;和SELECT * FROM information_schema.TRIGGERS;,确认是否存在非运维添加的函数或触发逻辑
验网络暴露与服务配置
不少入侵根本不需要密码——只因 MySQL 被直接暴露在公网:
-
确认监听范围:查看 MySQL 配置文件(如
/etc/mysql/mysql.conf.d/mysqld.cnf),检查[mysqld]段中是否有bind-address = 127.0.0.1或skip-networking;若为0.0.0.0或缺失,则服务对外可见 -
验证端口开放情况:在服务器上执行
ss -tlnp | grep :3306或netstat -tuln | grep :3306,观察 Local Address 是否包含非 127.0.0.1 的地址 -
检查防火墙策略:运行
ufw status(Ubuntu)或firewall-cmd --list-ports(CentOS),确认 3306 是否被意外放行给全网










