针对 CVE-2026-109618 / CVE-2026-109619(PHP 核心 RCE)的非破坏性扫描器。通过 crt.sh + subfinder 进行子域名侦察,稳健的 banner 抓取,基于版本的检测。
针对 CVE-2026-109618(通过 OOM 损坏实现 RCE)和 CVE-2026-109619(通过过期的全局状态实现 RCE)的非破坏性扫描器(可选启用探测)——这些是 PHP 核心漏洞,已在 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 中修复。
✅ 已对照官方 php-src 安全公告验证(2026-10-21,严重)。 下方的 CVE ID 和修复版本表与上游完全一致。
- CVE-2026-109618 — GHSA-w8hw-w9fx-j79w
- CVE-2026-109619 — GHSA-6wmf-4rv5-p3rp
| 分支 | 受影响 | 已修复 |
|---|---|---|
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.5 | < 8.5.12 | 8.5.12 |
| < 8.2 | 已停止支持(EOL)——无上游补丁 | 检查发行版/OSV 向后移植 |
| 模式 | 功能 |
|---|---|
LOCAL | 通过 php -r 获取精确的运行时版本、SAPI、memory_limit、post_max_size |
REMOTE | 通过 X-Powered-By / Server 响应头和暴露的 phpinfo() 进行版本指纹识别 |
PRESENCE | 无版本信息的 PHP 检测(PHPSESSID、.php 引用、重定向) |
BANNER | 稳健的原始套接字 banner 抓取——HEAD/GET/OPTIONS + 畸形探测,http/https,错误页面泄露 |
RECON | 通过 crt.sh(证书透明度)进行子域名枚举,并以 subfinder 作为回退/合并,然后对解析出的主机进行扇出扫描 |
PROBE | (可选启用) 发送大型 multipart 请求以观察 worker 不稳定——可能导致 DoS |
git clone https://github.com/JoasASantos/php2shell-scanner.git
cd php2shell-scanner
# stdlib only — no pip deps.
# Optional recon fallback: ProjectDiscovery subfinder
# brew install subfinder (or: go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest)
# Local runtime check
python3 php2shell_scan.py --local
# Single remote target, look for exposed phpinfo()
python3 php2shell_scan.py https://example.com --phpinfo-paths
# Subdomain recon (crt.sh + subfinder) then scan, 10 threads, JSON out
python3 php2shell_scan.py example.com --recon --threads 10 -o out.json
# Recon only, no scanning
python3 php2shell_scan.py example.com --recon-only
# Target list + forced robust banner grab
python3 php2shell_scan.py -f targets.txt --banner
# OPT-IN load probe (authorized use only — DoS risk)
python3 php2shell_scan.py https://example.com --probe --probe-count 5
| 参数 | 含义 |
|---|---|
--local | 通过 php 二进制进行本地扫描 |
--recon | 将每个域名扩展为子域名(crt.sh + subfinder),然后扫描可解析的主机 |
--recon-only | 仅枚举子域名,不进行扫描 |
--banner | 对每个目标强制使用稳健的原始套接字 banner 抓取 |
--phpinfo-paths | 探测常见的暴露 phpinfo() 路径 |
--deep-version | 额外的版本识别技术:PHP 彩蛋 + 版本泄露文件(composer.json、.env 等) |
--origin-scan | 穿透 Cloudflare/WAF 直达 PHP 源站——携带真实 Host 头直接向 IP 发起请求 |
--shodan-key | 用于源站情报的 Shodan API 密钥(或环境变量 SHODAN_API_KEY);隐含启用 --origin-scan |
--censys-id / --censys-secret | Censys API 凭据(或环境变量 CENSYS_API_ID / CENSYS_API_SECRET);隐含启用 --origin-scan |
--probe | 多部分负载探测——存在 DoS 风险,仅限授权使用 |
--probe-count N | 探测请求数量(默认 5) |
--threads N / --timeout N | 并发数 / 单请求超时 |
--insecure | 不验证 TLS |
-o FILE / --csv FILE | 保存 JSON / CSV 报告 |
除版本检查外,每个目标还会通过被动信号(来自正常响应)进行增强,以细化判定并减少误报:
fpm、mod_php)会复用请求状态 → 易受 CVE-2026-109619 影响;纯 cgi 则影响小得多。ubuntu、+deb、.el8 等)——向后移植补丁可能在不提升版本号的情况下修复漏洞 → 降低置信度,并提示“请核对变更日志”。post_max_size / max_input_vars(CVE-2026-109618 的 OOM 攻击面)、disable_functions。--deep-version)当 banner 中无版本信息时:PHP 彩蛋(?=PHPE9568F34-... → 在 expose_php=On 时返回 GIF/credits)以及版本泄露文件(composer.json、.env 等;.env 中的 PHP_VERSION 为精确版本,而 "php": ">=8.2" 这类约束仅能缩小分支范围)。
--origin-scan)CDN 会隐藏源站,因此仅读取响应头只能看到边缘节点。--origin-scan 会:
www、未代理的前缀(origin.*、cpanel.*、mail.* 等)以及侦察得到的子域名;Host + SNI 直接请求每个剩余的源站 IP,直接从源站读取 Server / X-Powered-By / 错误页面。这是对已暴露 IP 的直接请求。仅限授权目标使用。
凭据情报可补充 DNS 从未暴露的 IP,以及来自已索引 banner 的 PHP 版本(标记为情报——可能已过时):
--shodan-key / 环境变量 SHODAN_API_KEY——按 hostname:<domain> 查询主机。--censys-id + --censys-secret / 环境变量 CENSYS_API_ID + CENSYS_API_SECRET——按 TLS 证书 / DNS 名称查询主机。--origin-scan。export SHODAN_API_KEY=xxx CENSYS_API_ID=xxx CENSYS_API_SECRET=xxx
python3 php2shell_scan.py hackersec.com --origin-scan
| 置信度 | 含义 |
|---|---|
HIGH | 版本来自暴露的 phpinfo() 或 PHP 错误页面 |
MEDIUM | 版本来自 HTTP 响应头(expose_php=On) |
LOW | 仅为推断,或位于代理之后,或可能适用发行版向后移植补丁 |
合并输出按严重程度对目标分组,将 VULNERABLE 按置信度排序(HIGH 优先),并标记 LOW/MEDIUM 结果以便在报告前重新核查。
按分支将版本与 FIXED 表进行比较:
< fixed → VULNERABLE>= fixed → PATCHED< 8.2(EOL)→ VULNERABLE_EOL(无上游补丁;请检查发行版/OSV 向后移植补丁)仅对您拥有或明确获准测试的资产运行。--probe 模式可能会干扰脆弱的工作进程。您需对自己的使用行为负责。
MIT