Critical Severity CVE-2026-109618
Published: Oct 25, 2026

[GitHub] php2shell-exp

Rce
Type
N/A
CVSS Score
7
Views
Anonymous
Author

Description

Patch-derived PoC and RCE for the PHP session upload-progress pre-RINIT decode (CVE-2026-109618/109619)

# php2shell-exp

从 PHP 官方补丁 [`3584a98bda`](https://github.com/php/php-src/commit/3584a98bda) 反推的 PoC 与 RCE,附带 8.2.34 / 8.2.35 双容器差分环境。

Patch-derived PoC and RCE for the pre-RINIT session decode in PHP's upload-progress handler.

## 这是什么

- `exp/poc_pre_rinit.py` — 证明 upload-progress 在 RINIT 之前解码 session 并执行对象析构器,不执行命令
- `exp/exp_rce.py` — 同一条路径上执行任意命令,输出经 HTTP 回读
- `exp/poc_oom.py` — CVE-2026-109618 的 OOM 触发(仅触发,不是 RCE)
- `lab/` — `php:8.2.34-fpm` 与 `php:8.2.35-fpm`,各带 nginx

这条链在 8.2.34 上稳定打通,在 8.2.35 上被 `incomplete_classes_only` 挡住。它不是零依赖利用:需要目标在 RINIT 之前已经存在一个带危险魔术方法的类,lab 用 `opcache.preload` 模拟。

## 已验证

同一份代码、同一份配置,只换镜像:

| 分支 | 可利用 | 已修复 |
|---|---|---|
| 8.1 | 8.1.34(EOL,无官方修复) | — |
| 8.2 | 8.2.34 | 8.2.35 |
| 8.3 | 8.3.35 | 8.3.36 |
| 8.4 | 8.4.26 | 8.4.27 |
| 8.5 | 8.5.11 | 8.5.12 |

`./verify.sh` 在 8.2 分支上的输出:

```
PoC 8.2.34 (expect 0) 0
PoC 8.2.35 (expect 1) 1
RCE 8.2.34 (expect 0) 0
RCE 8.2.35 (expect 1) 1
[+] differential holds
```

完整输出和调用栈诊断见 [`docs/RESULTS.md`](docs/RESULTS.md)。

## 原理

补丁把 upload-progress 的解码标成“RINIT 之前,不允许用户代码”,并对该阶段启用 `incomplete_classes_only`。打补丁前,这段解码会把 session 记录里的对象按真实类实例化,`__wakeup` / `__unserialize` / `Serializable::unserialize` / `__destruct` 都在目标脚本编译之前运行。

利用分两步,全部走 HTTP:

1. `POST /app/upload.php`。该目录 `.user.ini` 设 `session.serialize_handler=php_serialize`;upload-progress 把 multipart filename 原样写进 session 文件,`x|O:6:"PrePwn":...` 连同竖线一起落盘。
2. `POST /api/pre.php`。该目录用默认 `php` handler,脚本里没有 `session_start()`。请求启动阶段 `php_session_rfc1867_update()` 仍然会解码:`php` 解码器在第一个 `|` 处切开,把后半段交给 `unserialize()`。
3. 8.2.34 上对象按真实类创建,`__destruct()` 执行 `shell_exec($cmd)`,输出写到 webroot 下的随机文件。
4. 8.2.35 上同一段数据被降级为 `__PHP_Incomplete_Class`,没有析构器,也没有文件。

Payload 由 `exp/lib2shell.py::php_object()` 显式拼出,长度前缀按字节计算:

```
x|O:6:"PrePwn":2:{s:3:"cmd";s:12:"id; hostname";s:3:"out";s:33:"/var/www/html/.pwn_xxxxxxxx.txt";}
```

补丁 hunk 与代码的逐条对应见 [`docs/DERIVATION.md`](docs/DERIVATION.md)。

## 快速开始

需要 Docker Compose 和 Python 3.8+(仅标准库)。

```

Community Rating
0

Login to rate this exploit

Quick Actions