CVE-2026-109618 和 CVE-2026-109619 — PHP 身份验证前远程代码执行漏洞利用及检测工具包

php2shell
CVE-2026-109618 和 CVE-2026-109619 — PHP 身份验证前远程代码执行漏洞利用及检测工具包
五条独立的远程代码执行链利用了 PHP session.upload_progress 和 Zend 引擎的内存溢出 (OOM) 漏洞。 漏洞存在于 14 年的代码中 ——PHP 5.4.0 (2012) 至 8.5.11。需要预先授权。部分攻击链无需应用程序漏洞。
影响 78% 的网站 ——包括 WordPress (43%)、Joomla、Drupal、Laravel、Magento 和所有默认 PHP 安装。
作者: 邓琦 | 出处: Substack | 日期: 2026年10月21日
CVE详情
| CVE | GHSA | CVSS | 描述 |
|---|---|---|---|
| CVE-2026-109618 | GHSA-w8hw-w9fx-j79w | 9.2 | OOM(内存不足)→ longjmp() 导致 Zend 引擎状态无效 → RCE(远程代码执行) |
| CVE-2026-109619 | GHSA-6wmf-4rv5-p3rp | 9.2 | FPM 工作进程请求中过时的全局状态 → UAF → RCE |
补丁: 提交 3584a98 — Zend 引擎中 300 个文件已更改。
攻击链
| 链 | 向量 | 预授权 | 状况 | SAPI |
|---|---|---|---|---|
| 一个 | 会话注入 + LFI | 是的 | 应用程序是否有任何 LFI 接收器 | 全部 |
| B | var_destroy UAF → 处理程序覆盖 | 不 | 应用程序调用 unserialize() |
全部 |
| C | 处理程序不匹配 → __destruct |
是的 | 两个目录具有不同的 serialize_handler | FPM |
| D | OOM 错误 → 过时 EG() |
是的 | 无 — 任何端点 | mod_php |
| E | FPM 会话 OOM → 过期 BG() |
是的 | 生产者:任意 session_start() 端点;消费者: 任意 端点 |
FPM |
Chain D 是最关键的: 针对任何 Apache mod_php 安装的 零依赖预认证 RCE 。
Chain E 在 FPM 上的适用范围几乎一样广泛:生产者需要任何调用该函数的端点 session_start() (几乎是通用的——WordPress、Laravel、Joomla、Drupal 等都支持),而 消费者可以是任何 PHP 端点 ——upload_progress rfc1867 处理程序在 SAPI 启动期间、应用程序代码之前运行。已验证:(代码中 nosession.php 未包含 session_start() )使用过时 BG(unserialize) 状态时会触发 502 崩溃。
漏洞利用
其中包含三个远程代码执行 (RCE) 漏洞(链 A、B、C) exploit/ :
| 文件 | 链 | 它的功能 |
|---|---|---|
chain_a_session_lfi.py |
一个 | 通过上传文件名注入 PHP 代码 → 本地文件包含漏洞(LFI),包含会话文件 → 远程代码执行漏洞(RCE) |
chain_b_uaf_rce.php |
B | zif_system var_destroy UAF →通过 EG() 发现→ var_dump 通过覆盖处理程序 /proc/self/mem → RCE |
chain_c_mismatch_rce.py |
C | 污染 FPM 工作进程 PS(serializer) → 通过文件名注入序列化对象 → __destruct 解码失败时触发 → 远程代码执行 |
Chains D 和 Chains E 漏洞利用程序仅供 付费用户 使用。
# Chain A: Session injection + LFI → RCE
python3 exploit/chain_a_session_lfi.py --host TARGET --port 80 --command 'id'
# Chain B: var_destroy UAF → RCE (run on target or via uploaded webshell)
php exploit/chain_b_uaf_rce.php
# Chain C: Handler mismatch → __destruct → RCE
python3 exploit/chain_c_mismatch_rce.py --host TARGET --port 80 --command 'id'
检测规则
预置的IDS/WAF/SIEM规则 detection/ :
| 文件 | 格式 | 签名 |
|---|---|---|
php2shell.rules |
苏里卡塔/斯诺特 | 13 条规则——请求、响应和核查 |
php2shell.yaml |
西格玛 | 5 条规则——Web 日志、进程创建、文件事件 |
modsecurity.conf |
ModSecurity v2/v3 | 7 条规则——适用于 Apache/Nginx |
php2shell.lua |
OpenResty Lua | 轻量级反向代理模块 |
最快的缓解措施: 在多部分 POST 请求体中阻止此类攻击 PHP_SESSION_UPLOAD_PROGRESS 。合法用途几乎为零,可覆盖两个 CVE 的主要攻击途径。
快速入门
git clone https://github.com/ikow/php2shell-poc.git && cd php2shell-poc
# Start the lab (PHP-FPM + nginx + Apache mod_php)
cd lab && docker compose up -d
# Verify each chain
python3 ../poc/verify_session_injection.py --target http://127.0.0.1:18080
python3 ../poc/verify_handler_mismatch.py --target http://127.0.0.1:18080
python3 ../poc/verify_oom_trigger.py --host 127.0.0.1 --port 18081
python3 ../poc/verify_fpm_stale_state.py --target http://127.0.0.1:18080
# Run an exploit
python3 ../exploit/chain_a_session_lfi.py --host 127.0.0.1 --port 18080 --command 'id'
存储库结构
php2shell-poc/
├── exploit/
│ ├── chain_a_session_lfi.py # RCE: session injection + LFI
│ ├── chain_b_uaf_rce.php # RCE: var_destroy UAF → handler overwrite
│ └── chain_c_mismatch_rce.py # RCE: handler mismatch → __destruct
├── detection/
│ ├── php2shell.rules # Suricata / Snort IDS rules
│ ├── php2shell.yaml # Sigma SIEM detection rules
│ ├── modsecurity.conf # ModSecurity WAF rules
│ └── php2shell.lua # OpenResty / Nginx Lua WAF module
├── poc/
│ ├── verify_session_injection.py # Verify Chain A
│ ├── verify_uaf_asan.php # Verify Chain B (ASAN)
│ ├── verify_handler_mismatch.py # Verify Chain C
│ ├── verify_oom_trigger.py # Verify Chain D
│ └── verify_fpm_stale_state.py # Verify Chain E
├── lab/
│ ├── docker-compose.yml # PHP-FPM + nginx + Apache mod_php
│ ├── setup.sh # One-click lab setup
│ └── php.ini / php-apache.ini # Vulnerable PHP configs
└── docs/
├── ANALYSIS.md # Full technical analysis
└── substack_article.md # Writeup source
减轻
; Immediate — reduces attack surface
session.upload_progress.enabled = Off
session.use_only_cookies = On
唯一彻底的解决方法是将 PHP 版本升级 到 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 或更高版本。内存溢出错误(Chain D)存在于 Zend 引擎核心中——任何 INI 设置都无法修复它。
下游影响
Wiz 已演示了在原生容器镜像上进行预授权远程代码执行 (RCE) 的案例:
| 平台 | 易受伤害的 | 笔记 |
|---|---|---|
| WordPress | 是的 | 核心程序不使用 PHP 会话,但 WooCommerce 和许多插件会使用。 |
| Joomla | 是的 | 默认使用原生 PHP 会话 |
| Drupal | 是的 | 默认使用原生 PHP 会话 |
| Magento | 是的 | 即使在维护模式下也存在漏洞 |
| Laravel | 是的 | PendingBroadcast 是一款知名的 __destruct 小工具 |
参考
- PHP 安全公告
- GHSA-w8hw-w9fx-j79w — CVE-2026-109618
- GHSA-6wmf-4rv5-p3rp — CVE-2026-109619
- 补丁提交 3584a98 — 300 个文件,Zend 引擎 + 扩展
- Cloudflare WAF 覆盖范围
- Sansec 分析 ——PHPSESSID 堆泄漏发现
- Wiz下游影响
- Corelight 检测 — Zeek + Suricata 社区规则
免责声明
本代码库仅供 授权的安全测试和教育用途。针对 D 链和 E 链(零依赖远程代码执行)的漏洞利用代码仅供 付费 订阅用户 获取。
执照
<sub><b><font dir="auto"><font dir="auto">关键词:</font></font></b> <font dir="auto"><font dir="auto">php2shell、CVE-2026-109618、CVE-2026-109619、PHP 远程代码执行 (RCE)、PHP 漏洞利用、session.upload_progress、预认证远程代码执行 (pre-auth RCE)、PHP 漏洞、PHP 会话注入、PHP 反序列化、PHP 内存溢出 (OOM)、PHP 内存损坏、释放后使用 (use-after-free)、GHSA-w8hw-w9fx-j79w、GHSA-6wmf-4rv5-p3rp、WordPress 远程代码执行 (RCE)、Joomla 远程代码执行 (RCE)、Drupal 远程代码执行 (RCE)、PHP 安全、WAF 规则、Suricata 规则、ModSecurity 规则、IDS 签名、PHP 8.2.35、PHP 8.4.27、会话上传进度、PHP 会话固定、rfc1867、longjmp、zend_bailout、Snort 规则、Sigma 规则、检测规则、PHP 补丁、PHP 严重漏洞</font></font></sub>