异常检测基础:常见异常类型
做数据库审计日志分析这么多年,我见过最多的就是这四类异常——SQL注入、暴力破解、权限滥用、数据泄露。说白了,大部分安全告警最后都能归到这几个大类里。你想想,日志里几万条记录,一眼扫过去就能判断个八九不离十,靠的就是对这几类异常形成肌肉记忆。
4.1 SQL注入
SQL注入的本质是攻击者把恶意SQL代码混进正常输入里,让数据库执行非预期的命令。我在项目里遇到过最典型的一次:某电商后台的搜索接口,日志里突然出现大量 OR 1=1 的尾巴,后面还跟着 UNION SELECT——明显有人在试探能不能绕过登录。
常见的注入特征有这些:
- 输入字段里出现
'、"、--、#等注释符 - 包含
OR 1=1、AND 1=2这种永真/永假条件 UNION SELECT后面跟着字段数探针- 请求参数突然变长,包含
EXEC、xp_cmdshell等存储过程调用
-- 一个典型的时间盲注日志片段
-- 正常查询
SELECT name FROM users WHERE id = 1
-- 注入试探
SELECT name FROM users WHERE id = 1 AND SLEEP(5)
4.2 暴力破解
暴力破解不新鲜,但它在审计日志里的“指纹”特别明显——短时间内大量失败的登录尝试。我有个习惯,先看登录失败日志里 client_ip 的分布。如果90%的失败都来自同一个IP,那基本是暴力破解跑不掉了。
有几个关键指标要盯着:
- 同一IP 5分钟内失败次数 > 50
- 用户名枚举:失败日志里的用户名按字母顺序递增
- 登录时间间隔稳定在几百毫秒(脚本跑的)
- 数据库账号名是不存在的用户(攻击者在扫描有效账户)
4.3 权限滥用
权限滥用比前两种隐蔽得多。内部员工用合法账号干非法的事,日志里看起来都是正常的SQL语句。我遇到过最头疼的一个案例:运维人员用 root 账号直接连生产库 SELECT * FROM customer_credit_card,他确实有权限,但业务上根本不需要查这些字段。
怎么发现?我总结了三个角度:
- 行为基线偏离:同一个账号平时只查20行,突然查了10万行,要报警
- 敏感对象访问:从没碰过
payments表的人突然在凌晨2点访问了 - 越权查询:普通账号执行了
GRANT、ALTER、SHOW DATABASES等管理类语句
4.4 数据泄露
数据泄露是后果最严重的异常类型。它不一定是外部攻击,也可能内部人员批量导出数据。我记得有一次,一家合作的支付公司出事,审计日志显示一个账号从 transactions 表里跑了300万条记录,用了5分钟,网络流量异常高——这就是典型的批量导出。
数据泄露在日志里的常见模式:
- 大结果集查询:返回行数 > 平时99.9%分位数
- 导出工具特征:
INTO OUTFILE、mysqldump、pg_dump出现 - 非工作时间批量操作:凌晨2-5点的密集读操作
- 异常的表级访问:某个只读账号突然遍历了所有数据表
检测数据泄露,我个人习惯建一个“敏感表白名单”,对 credit_card、ssn、password_hash 这类表的查询做分级告警。单次查超过1000行就警告,超过10000行直接阻断。
| 异常类型 | 主要特征 | 检测难点 | 我常用的信号 |
|---|---|---|---|
| SQL注入 | 特殊字符、UNION、延时函数 | WAF逃逸、编码混淆 | 3秒内5条特殊查询 |
| 暴力破解 | 大量失败登录、固定IP | 慢速攻击、分布式IP | 5分钟50次失败 + 滚动窗口 |
| 权限滥用 | 合法操作、超标访问 | 基线难建立、误报多 | 行为偏离 + 敏感对象 |
| 数据泄露 | 大结果集、批量导出 | 海量日志、SQL正常 | 结果行数 > 99.9% |
说到底,异常检测不是一上来就上深度学习。把这四个基础类型吃透,日志里80%的问题你都能第一时间抓住。剩下的20%——嗯,那是组合攻击和未知模式,后面章节咱们再聊。