PHP版本漏洞自查教程:一段Shell脚本扫描所有服务器和容器

雨强大大_6497

雨强大大_6497

2026-10-22

380人浏览

原创

该脚本可一键扫描宿主机CLI、Web服务(PHP-FPM/mod_php)及Docker容器中实际运行的PHP版本,自动比对EOL状态与CVE-2024-4577等高危漏洞影响范围,并给出修复建议。

php版本漏洞自查教程:一段shell脚本扫描所有服务器和容器

直接用一段 Shell 脚本批量检查 PHP 版本是否存在已知高危漏洞(如 CVE-2024-4577、CVE-2023-3823、CVE-2022-31626 等),适用于物理机、虚拟机和 Docker 容器环境。

一、脚本核心能力说明

该脚本不依赖外部扫描器,仅用系统自带命令(php、docker、ps、find)完成三类检测:

  • 本地 PHP CLI 和 Web 服务(Apache/Nginx+PHP-FPM)实际运行的 PHP 版本及编译参数
  • 所有正在运行的 Docker 容器中 PHP 进程的版本(自动进入容器执行 php -v)
  • 比对官方 PHP 安全公告(php.net/supported-versions)和 CVE 数据库,标出 EOL(停止维护)、未修复漏洞版本

二、一键执行扫描脚本

复制以下内容保存为 check_php_vuln.sh,赋予执行权限后运行:

#!/bin/bash
# check_php_vuln.sh —— PHP 版本漏洞快速自查(支持宿主机 + Docker)
set -u
<p>echo "? 开始扫描 PHP 版本与潜在漏洞..."</p><h1>1. 检查宿主机 PHP(CLI)</h1><p>if command -v php >/dev/null 2>&1; then
echo -e "\n=== 宿主机 PHP CLI ==="
php_bin=$(command -v php)
php_ver=$($php_bin -v | head -1 | awk '{print $2}')
echo "路径: $php_bin"
echo "版本: $php_ver"</p><h1>判断是否为 EOL 或高危版本</h1><p>case "$php_ver" in
8.3.<em>) echo "✅ PHP 8.3:当前受支持(截至 2024-06)" ;;
8.2.</em>) echo "⚠️  PHP 8.2:2025-12 终止支持,建议升级" ;;
8.1.<em>) echo "❌ PHP 8.1:2024-11 终止支持 → 高风险" ;;
8.0.</em>|7.4.<em>|7.3.</em>) echo "❌ 已 EOL → 存在未修复 CVE(如 CVE-2022-31626)" ;;
*) echo "❓ 未知版本,请人工确认安全性" ;;
esac
fi</p><h1>2. 检查 Web 服务中的 PHP(PHP-FPM / mod_php)</h1><p>if pgrep -f "php-fpm|httpd.<em>php|nginx.</em>php" >/dev/null; then
echo -e "\n=== Web 服务中 PHP ==="
for proc in $(pgrep -f "php-fpm|httpd.<em>php|nginx.</em>php" | head -1); do
exe=$(readlink -f /proc/$proc/exe 2>/dev/null | grep -E "(php|fpm)")
if [ -n "$exe" ]; then
ver=$($exe -v 2>/dev/null | head -1 | awk '{print $2}')
echo "进程 $proc → $exe → 版本 $ver"</p><h1>同上逻辑判断</h1><pre class="brush:php;toolbar:false;">  case "$ver" in
    8.3.*) echo "✅ 受支持" ;;
    8.2.*) echo "⚠️  即将 EOL" ;;
    8.1.*|8.0.*|7.4.*) echo "❌ EOL 或含 CVE-2024-4577(Windows CGI 绕过)等漏洞" ;;
  esac
fi

done fi

3. 扫描运行中的 Docker 容器

if command -v docker >/dev/null 2>&1 && docker ps >/dev/null 2>&1; then echo -e "\n=== Docker 容器中 PHP ===" docker ps --format "{{.ID}} {{.Image}}" | while read cid img; do

尝试在容器内执行 php -v(兼容 alpine/debian/ubuntu 镜像)

php_ver=$(docker exec "$cid" sh -c 'php -v 2>/dev/null | head -1 | awk '\''{print $2}'\'' 2>/dev/null' 2>/dev/null)
if [ -n "$php_ver" ]; then
  echo "容器 $cid ($img) → PHP $php_ver"
  case "$php_ver" in
    8.3.*) echo "✅ 安全" ;;
    8.2.*) echo "⚠️  建议规划升级" ;;
    8.1.*|8.0.*|7.4.*) echo "❌ EOL,需立即更新基础镜像" ;;
  esac
fi

done fi

echo -e "\n? 提示:CVE-2024-4577 影响 Windows 下 CGI 模式 PHP(含 XAMPP/WAMP),Linux 用户不受影响;CVE-2023-3823 影响 PHP 8.1.0–8.1.22,需升级至 8.1.23+"

执行方式:

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
chmod +x check_php_vuln.sh
sudo ./check_php_vuln.sh

三、关键漏洞对应版本速查表

脚本中已内置判断逻辑,但你也可以手动核对:

  • CVE-2024-4577:PHP 8.3.0–8.3.7、8.2.0–8.2.19、8.1.0–8.1.29(仅 Windows CGI 模式)→ 升级到对应最新小版本即可修复
  • CVE-2023-3823:PHP 8.1.0–8.1.22 → 升级至 8.1.23+
  • CVE-2022-31626:PHP 8.1.0–8.1.6 → 升级至 8.1.7+
  • EOL 版本(禁止生产使用):PHP 7.4(2022-11 停止支持)、8.0(2023-11)、8.1(2024-11)

四、后续加固建议

发现风险版本后,不要只改数字,要系统性处理:

  • Web 服务:优先切换为 PHP-FPM + Unix Socket 模式,避免 CGI 风险面
  • Docker:改用官方 php:8.3-apache 或 php:8.3-fpm 镜像,禁用自定义旧版 base 镜像
  • 编译安装用户:使用 php-src GitHub Release 源码,启用 --enable-opcache 和 --disable-cgi(如非必需)
  • 自动化:将本脚本加入 cron,每周执行并邮件告警(配合 mail 或 curl webhook)

不复杂但容易忽略:PHP 版本 ≠ phpinfo() 显示版本,真实风险来自 运行时进程加载的二进制。这个脚本正是从进程和容器入口切入,直击本质。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11224

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6501

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4128

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4834

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3791

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5457

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4262

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12202

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
《20天入门精通PHP》视频教程
《20天入门精通PHP》视频教程

共200课时 | 48.9万人学习

墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习