
CVE-2026-109618 / CVE-2026-109619(PHP 코어 RCE)용 비파괴 스캐너입니다. crt.sh + subfinder를 통한 서브도메인 정찰, 강력한 배너 그래빙, 버전 기반 탐지를 제공합니다.
CVE-2026-109618(OOM 손상으로 인한 RCE) 및 CVE-2026-109619(오래된 전역 상태로 인한 RCE)를 위한 비파괴 스캐너(옵트인 프로브 포함) — 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12에서 수정된 PHP 코어 버그입니다.
✅ 공식 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 | 견고한 원시 소켓 배너 수집 — HEAD/GET/OPTIONS + 변조된 프로브, http/https, 오류 페이지 노출 |
RECON | crt.sh(인증서 투명성)를 통한 서브도메인 열거, subfinder 폴백/병합 후 해석된 호스트에 대한 팬아웃 스캔 |
PROBE | (옵트인) 워커 불안정성을 관찰하기 위한 대용량 멀티파트 요청 — 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 | 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…) — 버전 범프 없이 백포트로 수정되었을 수 있음 → 신뢰도 하향, "changelog 확인" 참고 사항.post_max_size / max_input_vars(CVE-2026-109618의 OOM 표면), disable_functions.--deep-version)배너 버전이 없을 때: PHP 이스터 에그(?=PHPE9568F34-... → expose_php=On일 때 GIF/크레딧)와 버전 유출 파일(composer.json, .env, …; .env의 PHP_VERSION = 정확한 버전, "php": ">=8.2" 제약은 브랜치만 좁힘).
--origin-scan)CDN은 오리진을 숨기므로, 헤더를 읽어도 엣지만 보입니다. --origin-scan:
www, 프록시되지 않은 접두사(origin.*, cpanel.*, mail.*…) 및 정찰 서브도메인을 확인;Host + SNI로 요청하여, Server / X-Powered-By / 오류 페이지를 오리진에서 직접 읽음.이미 노출된 IP에 대한 직접 요청입니다. 승인된 대상에만 사용하세요.
자격 증명 기반 정보 수집은 DNS가 절대 노출하지 않는 IP와, 색인된 배너에서 얻은 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