Nginx高危漏洞CVE批量自动检测脚本实操教程
引言
很多站长只记得给网站打补丁,却忽略了底层的Nginx也可能存在高危漏洞。
如果让你一台台登录服务器查版本、查CVE,不仅累而且容易漏掉。
本文教你写一条简单的bash脚本,用来自动批量检测多台Nginx服务器是否受到当前常见高危CVE影响。
即使你刚接触Linux,也能照着步骤完成。
准备条件
- 一台Linux机器(作为脚本执行端,建议CentOS 7+或Ubuntu 18.04+)
- 已安装
curl和ssh客户端(通常系统自带) - 你有一份待检测服务器的IP列表和相应的SSH登录权限(推荐使用密钥认证)
- 待检测服务器上需要已安装Nginx,并允许执行
nginx -v命令
如果还没有密钥认证,可以先在本机执行ssh-keygen -t rsa生成公钥,然后将公钥追加到各目标服务器的~/.ssh/authorized_keys文件中。
创建批量检测脚本
在脚本执行机上新建文件 nginx_cve_check.sh,并写入以下内容:
#!/bin/bash
# Nginx高危漏洞批量检测脚本
# 用法:./nginx_cve_check.sh servers.txt
SERVER_LIST="$1"
if [[ -z "$SERVER_LIST" ]]; then
echo "错误:请传入服务器IP列表文件,例如:./nginx_cve_check.sh ip.txt"
exit 1
fi
# 定义已知高危CVE影响的Nginx版本区间(以常见CVE为例,可自行维护)
# 格式:"CVE编号|受影响版本正则"(这里用版本小于某个版本作为简单判断)
CVE_CHECKS=(
"CVE-2024-24989|1.24.0"
"CVE-2024-24990|1.24.0"
"CVE-2021-23017|1.21.0"
)
while IFS= read -r ip; do
if [[ -z "$ip" || "$ip" == \#* ]]; then
continue
fi
echo "=== 正在检测: $ip ==="
# 远程获取nginx版本(假设ssh可用密钥登录,用户为root)
version=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@"$ip" "nginx -v 2>&1 | grep -oP '[0-9]+\.[0-9]+\.[0-9]+'" 2>/dev/null)
if [[ -z "$version" ]]; then
echo "[跳过] $ip - 无法获取Nginx版本或连接失败"
continue
fi
echo " 当前版本: $version"
for check in "${CVE_CHECKS[@]}"; do
cve_id=${check%%|*}
affected_ver=${check##*|}
# 通过字符串比较判断版本是否小于受影响的版本(只适用于简单版本格式)
if [[ "$version" < "$affected_ver" ]]; then
echo " [高危] 发现 $cve_id 可能受影响(版本 $version < $affected_ver)"
fi
done
done < "$SERVER_LIST"
echo "扫描完成"
保存后赋予执行权限:chmod +x nginx_cve_check.sh。
如何使用脚本
- 准备服务器IP列表:新建
ip.txt,每行一个IP,可包含#注释行。 - 执行检测:
./nginx_cve_check.sh ip.txt - 观察输出:脚本会依次SSH到每台服务器获取Nginx版本,然后与内置的CVE受影响版本比对,打印出潜在风险。
注意:脚本中版本比较只适用于形如x.y.z的纯数字版本,如果版本号包含其他字符(如1.24.0+),比较结果可能不准确。对于生产环境,建议从Nginx官方安全公告获取更精确的受影响版本区间。
避坑指南
- SSH连接超时:如果目标服务器网络不通或SSH端口非标准(22),需要先在脚本中调整
-p参数或修改-o ConnectTimeout值。 - 版本提取失败:某些系统上
nginx -v输出可能包含“nginx version:”前缀,脚本已用正则提取,但如果编译自定义版本后缀(如1.24.0-1.el7.ngx),则可能匹配不到。建议先在某台服务器手动执行nginx -v确认输出格式。 - CVE列表时效性:脚本内置的CVE检查示例仅为演示,实际使用时请定期从 Nginx官方安全公告 或 CVE数据库更新受影响的版本列表。
- 权限问题:脚本以root身份远程执行,如果你使用普通用户,请确保该用户有执行
nginx -v的权限,或改用sudo。
效果验证
准备一台已知版本低版本的测试机(或使用虚拟机),执行脚本后应看到类似输出:
=== 正在检测: 192.168.1.100 ===
当前版本: 1.22.1
[高危] 发现 CVE-2024-24989 可能受影响(版本 1.22.1 < 1.24.0)
[高危] 发现 CVE-2024-24990 可能受影响(版本 1.22.1 < 1.24.0)
=== 正在检测: 192.168.1.101 ===
当前版本: 1.26.0
(无高危告警)
扫描完成
如果没有报错,说明脚本运行正常;
如果某些服务器无法连接,检查网络或SSH配置。
高频问题
Q:脚本检测结果可靠吗?
A:脚本仅通过版本号粗粒度判断,不能100%确认漏洞存在。部分CVE需要特定配置或模块才受影响,建议将脚本输出作为线索,再手动查阅官方公告。
Q:如何更新CVE列表?
A:编辑脚本中的 CVE_CHECKS 数组,按格式添加新的CVE编号和受影响版本。你也可以改为从远程URL拉取最新列表。
Q:为什么我的Nginx版本显示为 1.24.0+ 导致比较出错?
A:脚本中的字符串比较无法处理加号等字符。你可以先手动将版本标准化(例如去掉后缀),或改用 sort -V 进行版本比较。
如果你正在处理Nginx高危漏洞CVE批量自动检测脚本,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。