
Funktionaler PoC für CVE-2026-64638 (XSS2Shell): Pre-Auth-XSS-zu-RCE-Kette in WordPress Core. Docker-Labor + Python-Angriffsserver + technische Analyse und Mitigation.
Educationeller Proof of Concept der XSS2Shell-Kette (CVE-2026-64638), einer Pre-Authentifizierungs-Schwachstelle (XSS → RCE) im WordPress Core, eigenständig entdeckt von pwn.ai und am 7. August 2026 veröffentlicht.
CVE-2026-64638 ist eine Pre-Authentifizierungs-Schwachstelle für
reflektiertes Cross-Site-Scripting (XSS) im Anmeldebildschirm von WordPress
(wp-login.php). Sie betrifft alle unterstützten Versionen von WordPress
vor 7.0.3, die am 6. August 2026 als Notfall-Security-Release veröffentlicht
wurde. Ihr wurde ein CVSS v4.0 von 8.9 zugewiesen.
Die als XSS2Shell getaufte Kette demonstriert, wie ein Angreifer – ausgehend allein von einem fehlgeschlagenen Login-Versuch mit manipuliertem Benutzernamen – Folgendes tun kann:
strip_tags) und WordPress (wp_kses_post).user-profile.js)
zu kapern, um eine REST-JSONP-Anfrage an denselben Ursprung zu senden.jQuery.globalEval() in JavaScript-Ausführung im
WordPress-Ursprung umzuwandeln.Das Ergebnis ist Remote Code Execution (RCE) auf dem WordPress-Server unter
dem Benutzer des Web-Prozesses (typischerweise www-data) – ausgehend von
einem einzigen Klick des Administrators auf einen vom Angreifer
kontrollierten Link.
Dieses Repository enthält streng lehr- und verteidigungsorientiertes Material.
Die PoC wird mit einer eigenständigen Docker-Umgebung geliefert, die ausschließlich als lokales und reproduzierbares Angriffsziel dient.
┌─────────────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────────────┘
Die PoC ist für die Ausführung unter macOS oder Linux ausgelegt und benötigt:
zip-Erweiterung (für die manuelle Erstellung des
Payloads, optional; das bereits erstellte ZIP ist in payload/ enthalten).WordPress muss nicht manuell installiert werden: Die docker-compose.yml
startet ein verwundbares WordPress 7.0.2 (die letzte Version vor dem Patch)
zusammen mit MariaDB.