识别注入风险最有效方式是分析url参数中的异常字符、编码及关键词组合;nginx日志中$args和$request字段足以暴露sql、命令及模板注入行为,需重点关注单引号、分号、括号、null字节及其编码形式,以及union select、cat /etc/passwd、${等高危关键字,并结合grep、awk命令快速筛查,再通过状态码与响应体大小交叉验证提升准确率。

直接看 URL 参数里的异常字符、编码和关键词组合,是识别注入风险最有效的方式。Nginx 默认记录 $args(查询参数)和 $request(完整请求行),这两部分已足够暴露绝大多数 SQL 注入、命令注入和模板注入行为。
盯紧参数中“不该出现却高频出现”的字符
正常业务参数极少包含以下内容,一旦集中出现,需立即排查:
- 单引号(')、双引号(")、分号(;)、括号(())、NULL 字节(%00)——尤其在参数值末尾或孤立出现
- URL 编码形式:如 %27(')、%22(")、%3B(;)、%2527(%27 的二次编码,常用于绕过)
- 空格被编码为 %20,或用 /**/、+ 等替代,也是注入常见手法
筛查高危关键字组合
注入 payload 往往携带语义明确的关键词,注意它们在参数中的上下文位置:
- SQL 类:union select、select.*from、insert into、drop table、order by、sleep(、benchmark(、load_file(、into outfile
- 命令类:cat /etc/passwd、ls -la、id、whoami、curl http、bash -i、sh -c、nc -e
- 模板/执行类:${、#{、__import__、eval(、exec(、system(、<script></script>
用命令快速定位可疑请求
无需导入数据库,几条 shell 命令就能筛出线索:
- 查 SQL 注入特征:grep -iE "(union\s+select|select\s+.*from|sleep\(|benchmark\()" /var/log/nginx/access.log
- 查命令注入痕迹:grep -iE "(cat\s+/|ls\s+-|curl\s+http|bash\s+-)" /var/log/nginx/access.log | grep "\.php\?"
- 查编码绕过:awk '$7 ~ /%27|%22|%3B|%00|%2527/ {print $1, $4, $7}' /var/log/nginx/access.log | head -15
- 查超长参数(可能含 base64 或混淆 payload):awk 'length($7) > 400 {print $1, length($7), $7}' /var/log/nginx/access.log | head -8
结合响应特征交叉验证
只看请求易误报,叠加状态码与响应体大小能显著提升判断准确率:
- 大量 500/503 错误 + 含 sleep( 或 benchmark( 的请求 → 极可能是盲注探测
- 200 响应但 $body_bytes_sent > 1MB → 可能触发了文件读取或数据导出
- 同一 IP 在 1 分钟内反复触发 404 + 请求路径含 .env、web.config、/etc/passwd → 文件读取类注入尝试
- 状态码为 302 且 $http_referer 为空或来自非常规域名 → 常见于跳转型 XSS 或 SSRF 注入











