Nginx高危漏洞CVE批量自动检测脚本实操教程

引言

很多站长只记得给网站打补丁,却忽略了底层的Nginx也可能存在高危漏洞。
如果让你一台台登录服务器查版本、查CVE,不仅累而且容易漏掉。
本文教你写一条简单的bash脚本,用来自动批量检测多台Nginx服务器是否受到当前常见高危CVE影响。
即使你刚接触Linux,也能照着步骤完成。

准备条件

  • 一台Linux机器(作为脚本执行端,建议CentOS 7+或Ubuntu 18.04+)
  • 已安装 curlssh 客户端(通常系统自带)
  • 你有一份待检测服务器的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

如何使用脚本

  1. 准备服务器IP列表:新建 ip.txt,每行一个IP,可包含#注释行。
  2. 执行检测./nginx_cve_check.sh ip.txt
  3. 观察输出:脚本会依次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批量自动检测脚本,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
收录两极分化全站整改提升谷歌抓取
下一篇
爬虫抓取失败服务器全维度整改指南
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意