10月21日晚上十点,正准备洗澡睡觉,手机突然弹出一条安全推送:PHP曝出两个严重RCE漏洞,代号PHP2Shell,CVSS评分9.2,所有PHP站点尽快升级。

瞬间清醒了。作为一个PHP博客的站长,这种消息就是命令。赶紧打开电脑,开始了一场深夜紧急升级。

漏洞到底有多严重

先说说这个漏洞为什么被称为"核弹级"。

PHP2Shell包含两个漏洞:CVE-2026-109618和CVE-2026-109619。两个都是远程代码执行漏洞,而且不需要身份认证。

什么概念?就是任何能访问你网站的人,都可以通过构造一个特殊的POST请求,在你的服务器上执行任意代码。不需要登录,不需要权限,甚至不需要知道你的网站后台地址。

攻击者可以:

  • 篡改网站内容
  • 窃取数据库中的所有数据(包括用户密码)
  • 在服务器上植入后门
  • 甚至完全控制服务器

CVSS评分9.2(满分10),属于"严重"级别。国家网络安全通报中心都发了预警,可见这个漏洞的严重性。

漏洞原理简述

虽然是底层漏洞,但大概了解一下原理有助于理解为什么要紧急升级。

CVE-2026-109618:攻击者构造一个包含大量头部、嵌套字段名或空文件控件的multipart请求,可以在不超过post_max_size限制的情况下耗尽memory_limit,触发内存溢出(OOM)。在某些SAPI(比如Apache mod_php)中,OOM后的清理过程会处理无效状态,最终导致内存破坏和远程代码执行。

CVE-2026-109619:PHP工作进程会保留前一个请求的全局状态(错误、会话、对象等),但在释放请求内存前没有完全重置。攻击者可以通过两个连续的请求,利用跨请求的生命周期漏洞,实现释放后使用(UAF),最终导致远程代码执行。

简单来说:这两个漏洞都出在PHP的底层内存管理上,和你的业务代码无关。只要你用的是受影响的PHP版本,不管你代码写得多安全,都有可能被利用。

影响版本

受影响的版本范围很广:

  • PHP 8.2.x < 8.2.35
  • PHP 8.3.x < 8.3.36
  • PHP 8.4.x < 8.4.27
  • PHP 8.5.x < 8.5.12

安全版本:

  • PHP >= 8.2.35
  • PHP >= 8.3.36
  • PHP >= 8.4.27
  • PHP >= 8.5.12

注意:PHP 7.x已经停止维护,不在官方修复范围内。如果还在用PHP 7,建议尽快升级到受支持的版本。

我的升级过程

我的博客用的是宝塔面板,PHP版本是8.5.x。下面记录一下升级过程,给大家参考。

第一步:备份

升级前一定要备份!备份网站文件、数据库、配置文件。万一升级出问题,还能回滚。

第二步:查看当前版本

php -v

确认当前版本,确认是否在受影响范围内。

第三步:宝塔面板升级

宝塔面板的升级比较简单:

  1. 进入宝塔面板 → 软件商店
  2. 找到已安装的PHP版本
  3. 点击"切换版本",选择最新的安全版本(8.5.12)
  4. 等待安装完成

第四步:验证升级

php -v

确认版本已经升级到8.5.12。然后访问网站,确认所有功能正常。

第五步:检查扩展兼容性

升级后要检查所有PHP扩展是否正常加载。我用的几个扩展(redis、imagick、opcache)都没问题,但有些冷门扩展可能需要重新编译。

第六步:重启服务

升级PHP后,需要重启PHP-FPM和Web服务器(Nginx/Apache),确保新的PHP版本生效。

临时防护方案

如果暂时无法升级PHP,可以采取以下临时防护措施:

1. Web应用防火墙(WAF)

配置WAF规则,拦截包含异常multipart请求的流量。各大云厂商的WAF已经更新了PHP2Shell的防护规则。

2. Nginx层面限制

在Nginx配置中限制请求体大小和请求头数量:

client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;

3. 限制POST请求

对于不需要文件上传的接口,可以禁用multipart/form-data类型的请求。

但这些都只是临时方案,最根本的解决办法还是升级PHP。

升级后的验证

升级完成后,我做了以下验证:

  1. php -v 确认版本号正确
  2. php -m 确认所有扩展正常加载
  3. 访问网站前台和后台,确认功能正常
  4. 测试文章发布、评论、上传等核心功能
  5. 查看错误日志,确认没有新的报错

整个升级过程大概花了40分钟,从看到预警到升级完成,不到一小时。

一些思考

这次紧急升级让我有一些感触:

1. 安全补丁响应速度很重要

这种严重漏洞,从披露到被大规模利用,可能只有几个小时甚至更短。看到预警后要立刻行动,不能等"明天再说"。

2. 备份是最后一道防线

每次升级前都要备份。这次升级很顺利,但如果出了问题,没有备份就麻烦了。

3. 关注安全资讯

我是通过安全推送看到的这个漏洞。建议大家都关注一些安全资讯渠道(比如国家网络安全通报中心、各大云厂商的安全公告),第一时间获取漏洞信息。

4. 生产环境不要用太新的版本

我用的是PHP 8.5,属于比较新的版本。虽然新特性多,但也更容易遇到这种底层漏洞。如果对稳定性要求高,可以考虑用更成熟的版本(比如8.2或8.3)。

5. 自动化升级流程

这次是手动升级的。以后可以考虑写一个自动化脚本,遇到安全补丁时一键升级、验证、回滚。

写在最后

凌晨十二点半,升级完成,网站一切正常。洗了个澡,躺在床上,终于可以安心睡觉了。

做站长就是这样,7x24小时待命。一个漏洞预警,就能把你从床上拽起来。但这也是责任——你的网站上有用户的数据,有用户的信任,你必须对它负责。

如果你也在用PHP,赶紧检查一下版本,尽快升级。别等被攻击了才后悔。

安全无小事,警钟长鸣。