直接查mysql.user表中grant_priv、super_priv或repl_slave_priv为'y'的账号是发现异常提权的首要手段,因其反映权限字段突变;但须联动role_edges、proxies_priv、default_roles三表排查角色继承与代理权限,并扫描func、triggers、event等潜在后门载体。

查 mysql.user 表里有没有被悄悄提权的账号
异常提权往往不改密码,只加权限,所以账号本身可能看起来“正常”,但 Grant_priv、Super_priv 或 Repl_slave_priv 字段突然变成 'Y' 就是危险信号。别只看 SHOW GRANTS,它可能漏掉动态权限或角色继承。
直接查底层字段更可靠:
SELECT user, host, Grant_priv, Super_priv, Repl_slave_priv, authentication_string FROM mysql.user WHERE Grant_priv = 'Y' OR Super_priv = 'Y' OR Repl_slave_priv = 'Y';
-
Super_priv = 'Y'意味着能执行KILL、修改全局变量、绕过 SQL mode,普通运维账号绝不该有 -
Repl_slave_priv = 'Y'很隐蔽——配合LOAD DATA LOCAL INFILE可读取服务器任意文件,常被用于横向移动 - 如果
authentication_string长度明显短于 40(SHA256 哈希标准),说明密码可能被重置为弱加密插件,或被清空后未重设
检查角色链和 proxy 权限是否绕过主账号限制
MySQL 8.0+ 的权限模型复杂,单看 mysql.user 会漏掉 90% 的提权路径。攻击者常通过角色继承或代理机制隐藏权限来源。
必须连查三张表:
SELECT * FROM mysql.role_edges WHERE TO_USER = 'suspect_user' AND TO_HOST = 'suspect_host';
SELECT * FROM mysql.proxies_priv WHERE Proxied_user = 'suspect_user' AND Proxied_host = 'suspect_host';
SELECT * FROM mysql.default_roles WHERE USER = 'suspect_user' AND HOST = 'suspect_host';
- 只要
role_edges有记录,就得顺着FROM_USER和FROM_HOST继续查那个角色的权限,否则删错对象也清不掉权限 -
proxies_priv里出现Proxied_user = ''或Proxied_host = '%'是典型后门配置,允许任意用户以目标身份登录 -
default_roles被忽略会导致你以为用户没角色,其实每次登录自动激活高危角色
扫非标准函数、触发器和事件里的执行逻辑
后门不总在账号层,也可能藏在服务端可执行对象里。攻击者喜欢用 CREATE FUNCTION 或触发器做持久化控制,重启后仍生效。
重点查这些:
SELECT name, dl FROM mysql.func;
SELECT TRIGGER_SCHEMA, TRIGGER_NAME, EVENT_MANIPULATION, ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE ACTION_STATEMENT LIKE '%SELECT%UNION%' OR ACTION_STATEMENT LIKE '%LOAD_FILE%';
SELECT name, status FROM mysql.event WHERE status = 'ENABLED' AND body LIKE '%mysql.user%';
-
mysql.func中dl字段指向外部 .so 文件,是典型的提权后门载体,生产环境应禁止安装自定义函数 - 触发器中出现
UNION SELECT、LOAD_FILE、SLEEP等非常规语句,大概率是注入后留下的响应式后门 - 事件(event)若定期执行查询
mysql.user或写日志到临时表,可能是隐蔽的信息收集行为
对比当前连接与历史登录中的账号使用偏差
很多后门账号从不主动登录,只等被调用。但它们一旦被用,就会在连接日志里留下痕迹——尤其是短时间高频、来源 IP 异常、或命令类型突变。
先确认通用日志是否开启:
SHOW VARIABLES LIKE 'general_log%';
若关闭,临时打开并快速抓取:
SET GLOBAL general_log = 'ON';
SELECT * FROM mysql.general_log WHERE command_type = 'Connect' AND argument NOT LIKE '%health%' AND event_time > NOW() - INTERVAL 1 HOUR ORDER BY event_time DESC LIMIT 100;
- 重点关注
argument字段里有没有带--defaults-file=、-e "source /tmp/..."这类可疑参数 - 同一账号在 5 分钟内从不同公网 IP 登录多次,即使密码正确,也极可能是被爆破后用于跳板
- 如果某账号平时只连本地应用库,某天突然执行了
SELECT @@hostname或SHOW PROCESSLIST,就是提权探测行为
真实风险不在“有没有后门”,而在于你查的时候只看了 mysql.user 和 SHOW GRANTS ——角色、proxy、函数、事件、日志这五层,漏一层就等于给攻击者留了一条活路。











