状态码组合与时间规律是识别SQL注入探测的关键:高频交替的“200+500”序列、大量200伴随响应体长度突变或延迟波动、403/400爆发叠加特定UA及空Referer,均为自动化扫描强信号。

状态码本身不直接暴露SQL注入,但特定组合与时间规律能高效识别自动化探测行为。关键不是单个500或200,而是同一IP在短时间内的状态码分布模式——这是工具扫描最难以掩盖的痕迹。
关注“200 + 500 + 200”高频交替序列
自动化工具(如sqlmap)在布尔盲注或报错注入探测中,常构造两类载荷:
— 一类让查询逻辑为真(如 ' OR 1=1 --),返回正常页面(200);
— 另一类触发错误(如 ' OR 1=2 -- 或 updatexml(1,1,1)),引发数据库异常并返回500/503。
两者成对、高频、间隔均匀地出现,就是强信号。
实操建议:
— 用awk按IP+时间窗口聚合:提取5分钟内同一IP的请求,统计200与500出现频次及顺序;
— 若连续10次请求中,200与500交替占比超70%,且URI路径相同、仅参数变化,基本可判定为盲注扫描。
警惕“大量200 + 响应体长度突变”组合
时间盲注(如SLEEP(5))通常不改状态码,全为200,但响应耗时或响应体长度会出现规律性波动:
— 正常业务请求响应体长度相对稳定(如搜索页总在12–15KB之间);
— 注入探测时,攻击者会构造IF(1=1,SLEEP(3),0)和IF(1=2,SLEEP(3),0),前者延迟明显、后者无延迟,导致响应时间差达数秒;
— 更隐蔽的是利用LENGTH()或CONCAT()控制返回内容长度,造成响应体在固定区间内阶梯式跳变(如12480 → 12520 → 12560字节)。
注意:
— Nginx需开启$body_bytes_sent字段记录响应体大小;
— Apache需在log_format中加入%B;
— 结合$request_time(Nginx)或%D(Apache)才能捕捉延迟特征。
识别“403/400高频爆发+特定UA”扫库特征
当WAF或规则引擎拦截注入载荷时,会返回403(禁止)或400(错误请求)。攻击者用工具扫库(如遍历information_schema.tables)时,往往:
— 使用固定User-Agent(如sqlmap/1.0.8#dev、nuclei/2.9.4);
— 在1–2分钟内对同一路径发起上百次请求;
— 请求参数含schema、table_name、column_name等关键词,或URL中反复出现UNION SELECT结构。
这类行为在日志中表现为:
— 某IP+某UA在单位时间内403次数远超其他IP(如1分钟内403达87次,其余IP最高仅5次);
— 同一UA下,$request_uri中args部分高度相似,仅ID或表名递增(如?id=1→?id=2→?id=3,但实际是?q=1%20UNION%20SELECT%201,2,3等)。
结合Referer与请求频率做交叉验证
真实用户请求通常有合理Referer(如来自站内搜索页、导航链接);而自动化扫描多数无Referer,或Referer为硬编码的测试域名(如http://test.com/、http://127.0.0.1/)。
更可靠的做法是三字段联动分析:
— $remote_addr(源IP)
— $http_referer(是否为空或异常)
— $http_user_agent(是否匹配已知扫描器指纹)
当三者同时满足“高频请求 + 空Referer + sqlmap/nuclei UA”,无需看具体内容,即可标记为高置信度扫库行为。

















