利用 Nginx 日志定位攻击,核心思路是:先找到“异常请求”,再结合行为特征判断是否恶意。下面按“日志位置 → 关键字段 → 常见攻击特征 → 实战定位方法 → 工具与规则”系统讲一遍。
默认路径(常见):
/var/log/nginx/access.log/var/log/nginx/error.log如果你用了 nginx -t 看到的配置:
access_log /var/log/nginx/access.log main;
默认 main 格式示例:
192.168.1.10 - - [10/Oct/2024:12:00:01 +0800] "GET /admin.php?id=1' OR '1'='1 HTTP/1.1" 200 1234 "https://evil.com" "sqlmap/1.5"
字段含义:
| 字段 | 说明 |
|---|---|
| IP | 客户端 IP |
| 时间 | 请求时间 |
| 方法+URL | 攻击入口 |
| 状态码 | 200 / 404 / 500 |
| 字节数 | 返回大小 |
| Referer | 来源(常见伪造) |
| User-Agent | 客户端(常暴露工具) |
特征:
' OR UNION SELECT sleep()sqlmap排查:
grep -E "union|select|sleep\(|or 1=1" access.log
特征:
<script> onerror= alert(grep -E "<script|onerror=|alert\(" access.log
特征:
../ %2e%2e/ /etc/passwdgrep -E "\.\./|%2e%2e|passwd" access.log
特征:
;cat |id &&whoamigrep -E ";|&&|\|id|\|cat" access.log
特征:
nmap awvs dirbuster/wp-admin /phpmyadminawk '{print $1}' access.log | sort | uniq -c | sort -nr | head
特征:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
特征:
shell.php x.php a.aspxgrep -E "POST .*\.php" access.log | grep 200
✅ 攻击 ≠ 一条奇怪请求
✅ 攻击 = 异常 + 持续 + 目的性
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
grep "1.2.3.4" access.log
grep "1.2.3.4" error.log
log_format attack '$remote_addr - $request - $status - $http_user_agent - $request_time';
access_log /var/log/nginx/access.log attack;
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
if ($http_user_agent ~* (sqlmap|nikto|masscan)) {
return 403;
}
goaccess(实时可视化)fail2ban(自动封 IP)ELK / Grafana(攻击画像)WAF(ModSecurity)如果你愿意,可以:
我可以帮你逐条分析谁是攻击者、是否成功、怎么防。