
Lokales Docker-basiertes Labor zur Reproduktion von CVE-2026-87902, einem WordPress-Page-Template-Path-Traversal, das zu lokaler PHP-Dateieinbindung und PEAR-basierter RCE führt, mit einem PoC-Skript.
Lokale Docker-Testumgebung zur Reproduktion von CVE-2026-87902 (WordPress-Seitentemplate-Parsing-Pfad-Traversal → lokale PHP-Dateieinbindung → pearcmd-Dateischreiben-RCE).
⚠️ Nur für Sicherheitslernen und -forschung in autorisierten Umgebungen. Darf ausschließlich in lokalem Docker ausgeführt werden; die Verwendung gegen nicht autorisierte Ziele ist verboten. Die Schwachstelle wurde am 2026-09-22 offiziell behoben, und für alle unterstützten Branches wurden Patches veröffentlicht.
get_page_template() führt auf dem benutzerkontrollierbaren Parameter pagename ein zweites urldecode() aus und fügt das Ergebnis in die Kandidatennamen der Templates ein; locate_template() sucht die Datei mit file_exists() und prüft vor dem Laden nur realpath/Endung/Lesbarkeit, ohne zu verifizieren, dass der Pfad noch im Theme-Verzeichnis liegt (Canonicalization vorhanden, Containment nicht)| # | Bedingung | Wie dieses Testumfeld sie erfüllt |
|---|---|---|
| 1 | Eine veröffentlichte Seite ohne zugewiesenes benutzerdefiniertes Template | setup.sh erstellt und bereinigt automatisch eine Beispielseite |
| 2 | Ein page-*-Verzeichnis auf oberster Ebene des aktiven Themes | theme/mytheme/page-templates/ (das aktivierte Theme enthält dieses Verzeichnis) |
| 3 | Eine lesbare /usr/local/lib/php/pearcmd.php | Das offizielle PHP-Image enthält PEAR |
| 4 | register_argc_argv=On + beschreibbarer Ablageort | Das offizielle Image hat keine php.ini, der Kompilierungsstandardwert ist On; /tmp ist beschreibbar |
docker compose up -d # beim ersten Mal automatisches Herunterladen der Images (ca. 1 GB)
sh setup.sh # Installation + /flag platzieren + Überprüfung der vier Bedingungen
python cve-2026-87902.py --url http://127.0.0.1:8091
Erwartete Ausgabe:
[*] page id : 4 (about, default template, via /index.php?rest_route=...)
[*] depth 7 : stage 1 HTTP 200, stage 2 HTTP 200
[+] marker : 'CVE-2026-87902-POC-OK' found 12 time(s) in the stage-2 response
[+] EXPLOIT SUCCESSFUL - PHP executed with the web-server account's privileges
(12 Mal = die PEAR-Konfigurationsdatei hat 12 Konfigurationseinträge, in jedem ist eine Payload eingebettet)
Anzeigen der von PEAR in Stage 1 geschriebenen Datei (serialisierter Text, der mit #PEAR_Config 0.9 beginnt; die Payload ist als normale Zeichen in die 12 Konfigurationseinträge eingebettet):
docker compose exec wordpress cat /tmp/wp-pear-rce-flag.php
register_argc_argv=On bewirkt, dass der Query-String an + in $argv aufgeteilt wird, und pearcmd glaubt, im Terminal aufgerufen worden zu sein; config-create <root> <file> schreibt root (mit eingebettetem PHP-Code) unverändert in die Zieldatei<?=...?> wird ausgeführt und liest /flag aus und gibt es zurückCVE-2026-87902-POC-OK (befindet sich im Container unter /flag)setup.sh bitte mit Git Bash ausVollständige Bereinigung (Container + Datenvolumes + Images):
docker compose down -v --rmi all
docker-compose.yml WordPress 7.0.2-php8.3-apache + MySQL 8.4 + wp-cli
theme/mytheme/ Experimentelles Theme (enthält das Verzeichnis page-templates/, Bedingung ②)
cve-2026-87902.py PoC (von ressl/cve-2026-87902-poc, Urheberrecht beim Originalautor)
setup.sh Ein-Klick-Installation + Selbstprüfung der vier Bedingungen