
php2shell(CVE-2026-109618 및 CVE-2026-109619)용 고정밀 스캐너
PHP 애플리케이션에서 CVE-2026-109618 및 CVE-2026-109619를 탐지하기 위한 명령줄 도구입니다.
스캐너는 최소한의 멀티파트 제어 요청을 보낸 뒤 최대 세 개의 조작된 멀티파트 프로브를 전송합니다. 프로브는 62단계 깊이로 중첩된 PHP 배열 키를 사용하며 1 MiB에서 20 MiB까지 증가하는데, 이는 Assetnote의 내부 스캐너에서 사용하는 탐지 로직과 일치합니다.
프로브가 PHP 메모리 고갈 오류, 차별적인 빈 HTTP 500, PHP-FPM 워커 실패, 또는 패치되지 않은 것으로 알려진 PHP 버전을 나타낼 때 대상이 취약한 것으로 보고됩니다. 초기 5xx 응답, 일반적인 요청 거부 상태, 그리고 PHP 치명적 오류 시그니처가 없는 비어 있지 않은 HTTP 500 응답은 크래시 신호로 처리되지 않습니다.
스캐너는 기본적으로 /index.php를 테스트합니다. URL에 제공된 경로는 유지되며, --path 또는 --path-file을 사용하여 사용자 지정 경로를 테스트할 수 있습니다. phpMyAdmin 대상은 /show_config_errors.php에서 자동으로 재테스트됩니다. 리디렉션은 따르지 않습니다.
기본 --sapi auto 모드는 mod_php와 PHP-FPM 판정 규칙을 모두 적용하여 Assetnote의 postmodules의 결합된 동작과 일치합니다. --sapi mod_php 또는 --sapi fpm을 사용하여 탐지를 알려진 SAPI로 제한할 수 있습니다.
테스트되는 각 경로는 42바이트 제어 요청과 총 약 29 MiB에 달하는 세 개의 프로브를 수신할 수 있습니다. 판정이 확정되는 즉시 프로빙이 중단되며, 중복된 입력 URL은 한 번만 스캔됩니다.
pip install -r requirements.txt
단일 호스트 스캔:
python3 scanner.py -u https://example.com
호스트 목록을 스캔합니다:
python3 scanner.py -l hosts.txt
여러 스레드로 스캔하고 결과 저장:
python3 scanner.py -l hosts.txt -t 20 -o results.json
사용자 지정 헤더로 스캔:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
사용자 지정 경로 스캔:
python3 scanner.py -u https://example.com --path /phpinfo.php
python3 scanner.py -u https://example.com --path /index.php --path /admin.php
python3 scanner.py -u https://example.com --path-file paths.txt
PHP-FPM 판정 규칙만 사용:
python3 scanner.py -u https://example.com --sapi fpm
-u, --url Single URL to check
-l, --list File containing hosts (one per line)
-t, --threads Number of concurrent threads (default: 10)
--timeout Request timeout in seconds (default: 60)
-o, --output Output file for results (JSON)
--all-results Save all results, not just vulnerable hosts
-k, --insecure Disable TLS certificate verification
-H, --header Custom header (can be used multiple times)
-v, --verbose Show verdict reasons and response snippets
-q, --quiet Only output vulnerable hosts
--no-color Disable colored output
--sapi Verdict rules: auto, mod_php, or fpm (default: auto)
--path Custom path to test (can be used multiple times)
--path-file File containing paths to test (one per line)
php2shell의 최초 원본 발견은 Calif 팀에 기인합니다. 그들의 분석 글은 여기에서 확인할 수 있습니다: https://calif.io/php2shell/.
이 스캐너는 Assetnote 보안 연구팀이 Searchlight의 Exposure Platform을 위해 구축한 로직을 사용하여 개발했습니다.
결과는 터미널에 출력됩니다. -o를 사용하면 취약한 호스트가 판정 사유와 마스킹된 HTTP 요청/응답 증거와 함께 JSON 파일로 저장됩니다.
특정 PHP 구성에서는 스캐너의 멀티파트 프로브가 PHP의 memory_limit을 초과할 때 오탐을 보고할 수 있습니다. 이 경우 패치된 버전과 취약한 버전이 동일한 빈 HTTP 500 응답을 반환할 수 있습니다.
이는 패치된 PHP 8.4.27에서 memory_limit 값을 2M에서 32M까지 설정하여 재현되었으며, PHP 8.3.36에서 max_multipart_body_parts를 2785 이상으로 설정하고 128M일 때도 재현되었습니다. 정확한 임계값은 빌드마다 다를 수 있습니다.
PHP가 버전을 공개하지 않는 경우, 스캐너는 이 안전한 패치 후 OOM과 취약한 패치 전 동작을 구분할 수 없습니다. 따라서 결과는 설치된 PHP 버전 및 벤더 백포트와 대조하여 검증해야 합니다.