发现网站异常、访问变慢、数据莫名消失或出现陌生账号,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 是否被意外放行给全网
