sql注入检测需结合错误信息、响应差异与行为基线:出现mysql/ora-/sql syntax等报错可确认漏洞;waf静默时用时间差或布尔盲注验证;数据库日志重点监控元数据查询、union探路及高频逻辑判断语句。

怎么看请求里藏了SQL注入
直接看参数里有没有破坏SQL语法结构的痕迹——不是靠猜,是看服务器是否“说漏嘴”了。只要返回带 MySQL、ORA-、SQL syntax error、Unknown column 这类字样的错误,基本可以确认输入点被拼进了SQL语句且未过滤。
- GET参数如
?id=1'后页面报错,而?id=1''(多一个单引号)反而正常,说明后端用了字符型拼接,且没转义 - POST表单提交时,在用户名字段填
admin'--登录成功,大概率绕过了密码校验逻辑 - Cookie中
session_id=abc123' OR '1'='1导致权限异常提升,说明服务端拿它直接拼查询
注意:现代WAF常静默拦截或返回403,此时错误不出现≠没漏洞;得配合响应时间差(比如加 SLEEP(5) 后页面卡5秒)或布尔盲注(AND 1=1 vs AND 1=2 页面差异)进一步验证。
数据库日志里哪些SQL算可疑
真正有效的监控不靠“关键词黑名单”,而是抓偏离业务基线的行为模式。重点盯三类语句:
- 含
information_schema、mysql.user、sys.schema_table_statistics的查询——正常业务几乎不会读这些元数据表 - 大量
UNION SELECT+ 数字占位符(如UNION SELECT 1,2,3,4)+ 注释符(--或#),这是典型的联合查询注入探路行为 - 同一IP在1分钟内执行超20条带
OR 1=1、AND 'a'='a、ORDER BY后跟非常大数字(如ORDER BY 999)的查询——属于自动化工具扫库特征
别只查 SELECT,INSERT 和 UPDATE 里混入子查询(如 UPDATE users SET pass=(SELECT pass FROM admin WHERE id=1))同样危险,但容易被忽略。
为什么用Burp Intruder批量测比手动试更可靠
人工输几十次 '、"、;、-- 很快就漏掉边界情况;而Intruder能系统性覆盖编码变体和上下文闭合方式。
- Payload类型选
Sniper时,对id=1自动测试id=1'、id=1"'、id=1)、id=1))等,覆盖括号嵌套场景 - 用
Cluster bomb组合两个位置:比如同时 fuzzCookie: user=xxx和GET ?sort=xxx,模拟真实多参数注入链 - 关键要开
Grep - Extract提取响应里的SQL、error、Warning字样,再用Filter按状态码/长度突变自动标出异常项
坑点:默认不发 Content-Type: application/json 请求,若目标API走JSON传参,得先在Intruder里手动设好Header,否则payload根本送不进去。
WAF日志里怎么区分真实攻击和误报
很多WAF把 SELECT * FROM 当高危,结果开发人员写了个调试接口返回 SELECT * FROM logs LIMIT 10 就被封IP。真问题在“非预期上下文”:
- 正常用户不会在登录页URL里带
UNION SELECT,但在后台管理系统的SQL调试框里出现就是合法行为 -
1=1出现在WHERE条件里常见,但出现在ORDER BY后(如ORDER BY (SELECT 1 FROM dual WHERE 1=1))就极可能是延时盲注试探 - 高频400错误里若固定包含
mysql_real_escape_string或mysqli::real_escape_string报错信息,说明后端用了过时的转义函数,而非预编译——这是漏洞根源,不是误报
最易被绕过的点:WAF通常不解析URL解码后的字符串。攻击者发 %27%20OR%201%3D1%23(即 ' OR 1=1#),WAF若只查原始字节就可能放过。监控必须还原后再匹配。










