apache日志中易暴露sql注入尝试的请求路径包括/index.php?id=1' or '1'='1、/search?q=test%27%20union%20select%201,2,3--等,其核心特征是url或参数中出现单引号、union select、and 1=2、waitfor delay等高危字符串模式。

Apache日志里哪些请求路径容易暴露SQL注入尝试
SQL注入的早期试探行为,往往在URL路径或查询参数中留下非常典型的字符串模式,Apache的 access_log 会原样记录这些内容。关键不是看“有没有数据库报错”,而是看攻击者主动输入的恶意载荷是否已出现在请求中。
常见特征路径包括:
-
/index.php?id=1' OR '1'='1—— 单引号+逻辑恒真,最基础的闭合试探 -
/search?q=test%27%20UNION%20SELECT%201,2,3--—— URL编码后的UNION SELECT,常出现在搜索入口 -
/api/user?uid=1 AND 1=2—— 布尔盲注常用,通过响应差异判断逻辑真假 -
/product.asp?cid=1;WAITFOR%20DELAY%20'0:0:5'—— SQL Server延时注入,WAITFOR DELAY是强信号
注意:这些不一定触发数据库错误,但只要出现在 GET 或 POST 的原始请求行(%r 字段)里,就代表攻击已抵达Web层,必须拦截。
用awk/grep快速从access_log提取可疑请求
别依赖ELK或SIEM做实时分析——日常巡检或应急响应时,直接在服务器上用命令筛最高效。核心是匹配 URL 编码和原始字符的双重形态。
推荐这条组合命令(适配默认 LogFormat "%h %l %u %t \"%r\" %>s %O" combined):
awk '$0 ~ /\x27|UNION[[:space:]]+SELECT|AND[[:space:]]+[0-9]+=[0-9]+|--|#|SLEEP\(|WAITFOR[[:space:]]+DELAY/ {print $0}' /var/log/apache2/access.log | grep -i -E "(select|union|sleep|waitfor|benchmark|information_schema)"
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
\x27匹配原始单引号(绕过部分简单WAF),比'更可靠 - 用
[[:space:]]+匹配空格、制表符甚至URL编码的%20,避免漏掉变形写法 - 第二遍
grep -i是为了过滤掉误报(比如正常URL含and单词) - 不建议只用
grep -E "UNION.*SELECT"—— 攻击者常插入注释或空格来绕过正则
mod_security规则怎么写才不误杀正常业务
如果已在用 mod_security,别直接启用OWASP CRS全量规则——它对中文路径、带特殊符号的API参数(如 /v1/order?status=shipped&remark=已发货#2024)极易误判。
更稳妥的做法是自定义轻量规则,聚焦高置信度特征:
- 对
GET请求,在REQUEST_URI和ARGS中同时检测:SecRule REQUEST_METHOD "@streq GET" "phase:2,deny,status:403,msg:'SQLi: quote + comment',chain" - 下一行写:
SecRule REQUEST_URI|ARGS "@rx \x27\s*(?:--|#|/\*|\x00)|\b(?:UNION|SELECT|SLEEP|BENCHMARK)\b" "t:none,t:urlDecodeUni" - 禁用对静态资源(
.js、.css、/images/)的SQLi检查,加ctl:ruleRemoveById=981243 - 所有规则末尾加上
log,tag:'OWASP_CRS',severity:2,方便后续用grep "OWASP_CRS"审计
重点:先用 SecRuleEngine DetectionOnly 运行24小时,看日志里有多少真实业务被标记,再切到 On。
为什么只看路径还不够,必须结合Referer和User-Agent
单纯匹配 id=1' 类路径,漏报率很高——现代扫描器(如sqlmap)默认加 Referer: sqlmap 或伪造浏览器头,且大量使用 POST + JSON body,此时 REQUEST_URI 干净得像白纸。
真正有效的监控要交叉验证:
- 当
User-Agent含sqlmap、nuclei、acunetix且请求中任意参数含单引号或/*,直接封IP - 当
Referer为空(-)且REQUEST_URI含php?id=+ 非数字字符,属于高风险手工探测 - 同一IP在5分钟内触发3次以上含
information_schema的请求,不管方法是GET还是POST,都应进临时黑名单
Apache本身不解析POST body,所以这类判断必须靠 mod_security 的 REQUEST_BODY 变量,或前置用 nginx 做预处理——这点常被忽略,导致监控形同虚设。










