补丁没出POC先到了?PHP最新高危漏洞+免杀马完整攻击链

本文转载自微信公众号「allby森林之家」,作者:allby森林之家

原文标题:补丁没出POC先到了?PHP最新高危漏洞+免杀马完整攻击链

内容版权归原作者及原公众号所有,转载仅为传播资讯;若有侵权请联系管理员删除。

最近PHP 圈又又又…又炸了!

两个 CVSS v4.0 评分 9.2 的严重漏洞:CVE-2026-109618、CVE-2026-109619,PHP 官方预告今晚 22:00(北京时间)发布补丁。

但补丁还没到,一段叫 PHP2Shell 的演示视频先流出来了:输入 HTTP 目标地址 + 一条命令,直接返回操作系统回显 uid=33(www-data)。

演示甚至覆盖了WordPress、Drupal、Magento、Joomla、Laravel 等 9 款主流应用!!!真的是十分吓人😟😟😟

而漏洞本身,仅仅只是故事的开始。有了入口后,WebShell 才是常驻的根——让 Shell 站得住脚的那套免杀手法,又是这场攻防背后一道真正的分水岭。

图片[1]-补丁没出POC先到了?PHP最新高危漏洞+免杀马完整攻击链-阻击者联盟

01 先看入口:这漏洞为什么吓人

按目前公开信息,两个洞都是 PHP 解释器/引擎层的远程代码执行(RCE),CVSS 9.2,属于”严重”。

三个关键信号,每条都值得细品:

信号一:mod_php 和 PHP-FPM 两条路径都能打。也就是说,漏洞大概率在解释器/引擎层,和 SAPI 架构无关。别再说”我用 FPM,不关我事”。

信号二:回显是 www-data。不是 root,但已经够要命——数据库凭据能读、WebShell 能写、横向移动的起点有了。

信号三:影响面极大。有统计称约 150 万台暴露主机的 59% 还在跑 PHP 8.1 或更早分支——这些版本已 EOL,今天就算补丁发出来,它们也等不到修复包。

德国安全团队甚至拿它跟 Log4Shell 比:如果这两个洞能免认证、通过普通 HTTP 请求触发、影响常规配置,实际影响面可能超过 Log4Shell。

原因很直白:Log4Shell 的战场在 Java 企业内网,PHP 的战场在公网——WordPress、Drupal、Magento 和绝大多数共享主机,全靠它撑着。

02 入场:拿到门票,攻击者要干什么

图片[2]-补丁没出POC先到了?PHP最新高危漏洞+免杀马完整攻击链-阻击者联盟

漏洞只是门票,入场之后才是重头戏。

攻击者拿到 www-data 权限后,第一件事往往是:往服务器上留一个能持久控制的”后门”。

这个后门,就是 WebShell(一句话木马)。

它的逻辑很简单:把一段能执行命令的 PHP 代码放到目标站点目录里,然后通过 HTTP 请求传参执行。

经典形态长这样:

<?php @eval($_POST['cmd']); ?>

顺便把”怎么把马放进服务器”也补一句:除了漏洞直写,PHP 文件写入函数(fwrite、file_put_contents)配合一个解密函数(比如 base64_decode),是攻击者写马最常见的两条腿——先把 base64 内容解码再落地。

但问题来了——这句太经典了,杀软、WAF、主机安全产品、甚至扫描器,一眼就能认出来。

于是,”免杀”成为 WebShell 能否站住脚的关键。

免杀的本质就一句话:让高危函数和特征签名,看起来不像它们自己。

图片[3]-补丁没出POC先到了?PHP最新高危漏洞+免杀马完整攻击链-阻击者联盟

03 免杀第一层:绕开直白的参数+函数

最容易被杀的,是”高危函数直接出现在代码里”这种写法。

常规思路,用 PHP 的回调函数做中转:

<?php $a = array("who"."ami"); array_map('sys'.'tem', $a);  // 等价于 system('whoami')

把命令拼接、把函数名拼接——”system” 拆成 “sys”+”tem”,在静态扫描眼里就不是高危函数名了。

同类手法有一串:array_filter、array_walk、iterator_apply、foreach 动态调用,都是把函数名先拆开、再触发。

但这一类玩法,安全引擎早就摸透了,拼串特征会被标记。于是要继续升级。

04 免杀第二层:让函数名运行时还原

把函数名字符串变成”运行时才拼出来”的东西:

<?php $f = base64_decode("c3lzdGVt");  // system $f($_POST['cmd']);

更花哨的有:

ASCII 拼接(chr(115).chr(121)…);
ROT13(str_rot13(“flfgrz”));
Hex(hex2bin);
Gz 压缩后再解压;
甚至组合编码(先 hex 再 base64);
以及异或构造——用一个字符串跟另一个字符串按位异或,把”system”这种东西直接”算”出来。

这些手法的共同点:代码里不出现高危函数名,运行时才还原,静态检测看不到。

05 免杀第三层:让目标自己说出来

再往上,有人开始”不显眼地读”——从注释里、从数据库里、从目录里把代码抠出来。

比如用反射读类注释:

/** system($_GET['cmd']); */ class User {} $user = new ReflectionClass('User'); $comment = $user->getDocComment(); $f = substr($comment, 14, 22); eval($f);

比如连个 SQLite 数据库,把函数名存在表里再取出来执行。

比如遍历当前目录,从文件名里取出一截来当函数名。

这种”数据源藏代码”的路子,比前两层更隐蔽,因为静态特征更弱——检测引擎得先追数据流,成本高得多。

06 终极形态:直接整体混淆

以上都是”局部改造”,还有一条”终极路线”:把整个马子扔进混淆器,生成”非人代码”。

有不少现成工具,把正常的一句话木马、冰蝎马、哥斯拉马丢进去,输出是满屏 goto 和变量堆叠,人看不懂,查杀引擎扫描特征也跟不上。

(线下演示代码略,仅授权环境测试)

一条 WebShell,从”直接裸奔”到”变形藏身”,大概就是这么四层。安全引擎每出一版规则,攻击者就加一层包装——这是猫鼠游戏,也是免杀的本质。

07 结尾:别慌,听我总结

RCE 能不能打进来,看的是补丁勤不勤、资产清不清;
马能不能活下来,看的是主机的检测能力——以及你会不会排查。

对于运维的人来说,今天最关键的行动是:今晚补丁发布后,第一时间升级,重启所有相关进程。

mod_php 驻在 Apache 子进程、PHP-FPM 是独立 worker 池、CLI 常驻进程自成一体——二进制更新后旧进程内存里还是老代码,php -v 显示新版本号,不代表修复已完成,要核对进程启动时间或 phpinfo 的 build 日期。

没被及时打的旧版本(PHP 8.1 及更早)今天起就是高危区!​​​所以​如果你手上有还在跑 PHP 老版本的服务器,​请抓紧修复!

【免责声明】本文仅用于安全研究与授权测试,攻击链描述用于防守认知,禁止对未授权系统实施任何操作。


— 阅读原文请访问微信公众号「allby森林之家」 · 原文链接 —

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像-阻击者联盟
欢迎您留下宝贵的见解!
提交
头像-阻击者联盟

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容