发现sql注入后第一反应是立即隔离风险:断开应用与数据库连接、禁用被攻破账号,并终止其活跃会话,而非先查日志;随后反向追踪异常会话,彻底撤销权限时须处理角色继承与级联授权,并同步终止残留连接。

发现SQL注入后第一反应不是查日志,而是立刻隔离
生产环境里,等日志分析完,攻击者可能已经导出管理员表、写入webshell,甚至用 INTO OUTFILE 把木马扔进Web目录。必须跳过“先定位漏洞点”这类耗时动作,直接执行物理隔离:
- 在应用层:临时修改数据库连接池配置,把
jdbc:mysql://或host指向一个无效地址(如127.0.0.1:3307),或重启应用服务切断所有活跃连接 - 在数据库侧:对MySQL立即执行
REVOKE ALL PRIVILEGES ON *.* FROM 'app_user'@'%'; FLUSH PRIVILEGES;;PostgreSQL则运行ALTER ROLE app_user NOLOGIN;并REVOKE ALL ON DATABASE mydb FROM app_user; - 别只改密码——攻击者可能已拿到长期有效的连接句柄,改密不中断已有会话
靠 PROCESSLIST 或 pg_stat_activity 反向追踪异常会话
大多数生产库没开 general_log 或 log_statement,审计日志为空白。此时唯一实时线索是数据库自身的会话视图:
- MySQL:执行
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE INFO IS NOT NULL AND (INFO LIKE '%UNION%' OR INFO LIKE '%sleep(%' OR INFO LIKE '%benchmark%');,重点关注TIME > 60且来源IP非常规的连接 - PostgreSQL:查
SELECT pid, usename, client_addr, state, query FROM pg_stat_activity WHERE state = 'active' AND query ~ '(UNION|pg_sleep|COPY|LOAD_FILE)'; - 查到可疑会话后,立刻用
KILL [ID](MySQL)或SELECT pg_terminate_backend(pid)(PostgreSQL)终止,否则权限撤了连接还在跑
撤销权限时必须处理角色继承和级联授权
只对用户执行 REVOKE 常常无效,因为权限可能来自角色或被转授出去:
- MySQL中若存在
CREATE ROLE r1; GRANT SELECT ON db.* TO r1;,再GRANT r1 TO 'app_user'@'%';,那么单纯REVOKE SELECT ON db.* FROM 'app_user'@'%'不起作用——得先REVOKE r1 FROM 'app_user'@'%';,再DROP ROLE r1; - PostgreSQL默认
REVOKE不级联,如果app_user执行过GRANT SELECT ON table1 TO report_user WITH GRANT OPTION;,那么只撤app_user的权限,report_user仍保有访问权——必须加CASCADE:REVOKE SELECT ON table1 FROM app_user CASCADE; - 检查危险权限:MySQL确认是否含
FILE、PROCESS、GRANT OPTION;PostgreSQL确认rolsuper是否为t,是则优先降权
临时加固不能只靠WAF规则或输入过滤
应急阶段的临时措施要直击执行链路最薄弱环节,而非依赖边界防护:
- 禁用高危函数:MySQL执行
SET GLOBAL secure_file_priv = '';(清空值),并确认local_infile为OFF;PostgreSQL停用lo_import()、pg_read_file()等扩展函数 - 限制查询复杂度:MySQL可设
max_execution_time = 1000(毫秒),PostgreSQL调低statement_timeout,让盲注类探测快速超时失败 - 绕过WAF的payload往往走Header或JSON体,临时策略应在应用入口统一拦截含
UNION SELECT、information_schema、pg_sleep的请求体,而不是只过滤GET参数
真实应急里最易被忽略的点:权限撤销后,app_user 的旧连接仍能继续执行未完成事务,甚至把刚撤掉的权限重新 GRANT 回去——必须同步 KILL 或 pg_terminate_backend,否则所有操作形同虚设。











