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
确认当前版本,确认是否在受影响范围内。
第三步:宝塔面板升级
宝塔面板的升级比较简单:
- 进入宝塔面板 → 软件商店
- 找到已安装的PHP版本
- 点击"切换版本",选择最新的安全版本(8.5.12)
- 等待安装完成
第四步:验证升级
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。
升级后的验证
升级完成后,我做了以下验证:
- php -v 确认版本号正确
- php -m 确认所有扩展正常加载
- 访问网站前台和后台,确认功能正常
- 测试文章发布、评论、上传等核心功能
- 查看错误日志,确认没有新的报错
整个升级过程大概花了40分钟,从看到预警到升级完成,不到一小时。
一些思考
这次紧急升级让我有一些感触:
1. 安全补丁响应速度很重要
这种严重漏洞,从披露到被大规模利用,可能只有几个小时甚至更短。看到预警后要立刻行动,不能等"明天再说"。
2. 备份是最后一道防线
每次升级前都要备份。这次升级很顺利,但如果出了问题,没有备份就麻烦了。
3. 关注安全资讯
我是通过安全推送看到的这个漏洞。建议大家都关注一些安全资讯渠道(比如国家网络安全通报中心、各大云厂商的安全公告),第一时间获取漏洞信息。
4. 生产环境不要用太新的版本
我用的是PHP 8.5,属于比较新的版本。虽然新特性多,但也更容易遇到这种底层漏洞。如果对稳定性要求高,可以考虑用更成熟的版本(比如8.2或8.3)。
5. 自动化升级流程
这次是手动升级的。以后可以考虑写一个自动化脚本,遇到安全补丁时一键升级、验证、回滚。
写在最后
凌晨十二点半,升级完成,网站一切正常。洗了个澡,躺在床上,终于可以安心睡觉了。
做站长就是这样,7x24小时待命。一个漏洞预警,就能把你从床上拽起来。但这也是责任——你的网站上有用户的数据,有用户的信任,你必须对它负责。
如果你也在用PHP,赶紧检查一下版本,尽快升级。别等被攻击了才后悔。
安全无小事,警钟长鸣。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录