
Неразрушающий сканер для CVE-2026-109618 / CVE-2026-109619 (RCE в ядре PHP). Разведка поддоменов через crt.sh + subfinder, надёжный захват баннеров, обнаружение на основе версии.
Неразрушающий сканер (с опциональной проверкой probe) для CVE-2026-109618 (RCE через
повреждение OOM) и CVE-2026-109619 (RCE через устаревшее глобальное состояние) — ошибки
ядра PHP, исправленные в 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12.
✅ Проверено по официальным рекомендациям php-src (2026-10-21, критический уровень). Идентификаторы CVE и таблица исправленных версий ниже точно соответствуют upstream.
- 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 — нет upstream-патча | проверьте backport дистрибутива/OSV |
| Режим | Что делает |
|---|---|
LOCAL | php -r для точной версии среды выполнения, SAPI, memory_limit, post_max_size |
REMOTE | Определение версии через заголовки X-Powered-By / Server и открытый phpinfo() |
PRESENCE | Обнаружение PHP без определения версии (PHPSESSID, ссылки на .php, редиректы) |
BANNER | Надёжный захват баннера через raw-socket — HEAD/GET/OPTIONS + некорректный запрос, http/https, раскрытие информации на странице ошибки |
RECON | Перечисление поддоменов через crt.sh (Certificate Transparency) с резервным/совмещённым использованием subfinder, затем веерное сканирование с разрешением хостов |
PROBE | (опционально) Крупные multipart-запросы для наблюдения за нестабильностью воркеров — может вызвать 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 | Принудительный надёжный захват баннера через сырой сокет на каждой цели |
--phpinfo-paths | Проверка типовых путей с открытым phpinfo() |
--deep-version | Дополнительные методы определения версии: пасхалки PHP + файлы с утечкой версии (composer.json, .env, …) |
--origin-scan | Достижение origin-сервера PHP за Cloudflare/WAF — прямой запрос на IP с реальным заголовком Host |
--shodan-key | API-ключ Shodan для разведки origin (или переменная окружения SHODAN_API_KEY); подразумевает --origin-scan |
--censys-id / --censys-secret | Учётные данные API Censys (или переменные окружения 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…) — бэкпорт может исправить
уязвимость без изменения версии → уверенность снижается, примечание «проверьте changelog».post_max_size /
max_input_vars (поверхность OOM для CVE-2026-109618), disable_functions.--deep-version)Когда версия в баннере отсутствует: пасхалки PHP (?=PHPE9568F34-... → GIF/credits
при expose_php=On) и файлы с утечкой версии (composer.json, .env, …;
.env PHP_VERSION = точная версия, ограничение "php": ">=8.2" лишь сужает ветку).
--origin-scan)CDN скрывают origin, поэтому чтение заголовков показывает только edge. --origin-scan:
www, непроксируемые префиксы (origin.*, cpanel.*, mail.*…)
и поддомены из разведки;Host + SNI,
читая Server / X-Powered-By / страницы ошибок прямо с origin.Прямой запрос к уже раскрытому IP. Только авторизованные цели.
Разведка с учётными данными добавляет IP, которые DNS никогда не раскрывает, плюс версию PHP из проиндексированного баннера (помечается как разведданные — могут быть устаревшими):
--shodan-key / env SHODAN_API_KEY — хосты по hostname:<domain>.--censys-id + --censys-secret / env 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 (нет исправления от upstream; проверьте бэкпорт дистрибутива/OSV)Запускайте только против активов, которыми вы владеете или на тестирование которых у вас есть явное разрешение. Режим
--probe может нарушить работу нестабильных воркеров. Вы несёте ответственность за своё использование.
MIT