Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-87902 — WordPress Core <= 7.1.1 nicht authentifizierte LFI zu RCE - Validierungslabor, PoC, nuclei-Template (GHSA-7hp8-65ch-5whp) | Kitploit
Tools/GitHubGitHub/hassham1/cve-2026-87902
SchwachstellenscannerSchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsPapers & ForschungLernen & BildungPayload-EntwicklungLabs & Praxis
GitHub
12vor 8h 55mNoch nicht geprüft
hassham1/cve-2026-87902

CVE-2026-87902

WordPress Core <= 7.1.1 nicht authentifizierte LFI zu RCE - Validierungslabor, PoC, nuclei-Template (GHSA-7hp8-65ch-5whp)

Repository anzeigen

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-87902 - WordPress Core Unauthenticated LFI → RCE Validation Lab

Sicherheitsforschungsmaterial zur Reproduktion und Validierung von CVE-2026-87902 (GHSA-7hp8-65ch-5whp) in einem isolierten, nur auf Loopback beschränkten Docker-Lab: ein unauthentifizierter Local File Inclusion in der Page-Template-Auflösung des WordPress-Kerns, eskalierbar zu Remote Code Execution.

  • Betroffen: WordPress 4.7.0 bis 7.1.1 (jeder gepflegte Branch)
  • Behoben: 7.1.2 und branch-spezifische Backports (4.7.37, 5.9.18, 6.9.9, 7.0.6, …) - 22. Sep. 2026
  • CVSS 4.0: 9.2 (AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)
  • CWE-98 - Improper Control of Filename for Include/Require Statement

Urteil

Status: im bereitgestellten Lab nachgewiesen.

WordPress 7.1.1 (Twenty Twelve Theme) erlaubt einem unauthentifizierten Angreifer, PHP-Dateien von außerhalb des Theme-Verzeichnisses über die pagename-Query-Variable einzubinden, und - mit dem standardmäßigen register_argc_argv = On des offiziellen PHP-Images - eine Marker-Datei über PEAR pearcmd.php zu schreiben und auszuführen:

root@kitploit:~
WordPress: 7.1.1
Theme:     twentytwelve (page-templates/ present)
PHP:       8.2 (official image, register_argc_argv=On, PEAR present)
Result:    LFI oracle fired (<opml version="1.0">); marker probe executed as
           uid=33(www-data) and self-deleted

WordPress 7.1.2 mit identischem Setup blockiert das Oracle vollständig (Negativkontrolle). Dies demonstriert Codeausführung als der WordPress-Webserver-Benutzer innerhalb des Containers. Es demonstriert keinen Root-Zugriff, Container-Escape, laterale Bewegung oder Host-Kompromittierung.

Schnellstart

Voraussetzungen: Docker mit Compose v2, Python 3.10+, Netzwerkzugriff auf Docker Hub und wordpress.org (Theme-Installation).

root@kitploit:~
./lab verify

Dies baut das verwundbare Lab, erfordert, dass das LFI-Oracle und der RCE-Marker auslösen, baut dann das gepatchte Lab und erfordert, dass das Oracle stumm bleibt.

Um einen anderen Loopback-Port zu verwenden: LAB_PORT=9499 ./lab verify.

Alles anschließend mit ./lab reset entfernen.

Erwartete Nachweise

Verwundbare Kontrolle:

root@kitploit:~
[+] page-* folder(s) reachable: page-templates (traversal can resolve)
[!!!] LFI CONFIRMED (safe oracle: wp-links-opml.php)
...
[RCE] pearcmd.php reachable and taking argv: /usr/local/lib/php/pearcmd.php
[!!!] RCE CONFIRMED (pearcmd.php config-create file write):
  evidence: uid=33(www-data) (command `id` ran as the web user)
  cleanup : probe self-deleted on execution: confirmed
RESULT: VULNERABLE CONTROL CONFIRMED

Gepatchte Kontrolle:

root@kitploit:~
[=] oracles did not fire: target patched (>= 7.1.2), ...
RESULT: PATCHED CONTROL CONFIRMED

Ein HTTP 200, ein WAF-Block oder eine partielle Traversierung ohne den Oracle-Marker wird nicht als Beweis akzeptiert.

Manueller Lab-Lebenszyklus

root@kitploit:~
./lab start vulnerable   # fresh 7.1.1 lab on 127.0.0.1:9471
./lab test               # assert LFI + RCE
./lab start patched      # fresh 7.1.2 lab
./lab test               # assert oracle absence
./lab status
./lab reset              # containers, volumes, state

Die Tooling manuell gegen das laufende Lab ausführen:

root@kitploit:~
python3 poc/triage_cve_2026_87902.py --url http://127.0.0.1:9471
python3 poc/poc_cve_2026_87902.py --url http://127.0.0.1:9471 --rce
nuclei -t nuclei/cve-2026-87902.yaml -u http://127.0.0.1:9471 -silent

Für Systeme, die Sie besitzen oder für die Sie ausdrücklich autorisiert sind zu testen (Bug-Bounty-Scope, schriftliches Engagement), erfordern die Treiber die explizite Überschreibung:

root@kitploit:~
python3 poc/poc_cve_2026_87902.py --url https://target.example \
  --allow-authorized-non-loopback [--insecure] [--rce]

Ursache

get_page_template() in wp-includes/template.php erstellt einen Kandidaten-Template- Dateinamen aus der pagename-Query-Variable. Der benachbarte Branch drei Zeilen darüber leitet den Page-Template-Slug durch validate_file(); der pagename-Branch tat dies nie und schiebt zusätzlich einen zusätzlichen urldecode()-dekodierten Kandidaten ein:

root@kitploit:~
// wp-includes/template.php, get_page_template(), WordPress <= 7.1.1
if ( $pagename ) {
    $pagename_decoded = urldecode( $pagename );
    if ( $pagename_decoded !== $pagename ) {          // 7.1.2 adds validate_file()
        $templates[] = "page-{$pagename_decoded}.php";
    }
    $templates[] = "page-{$pagename}.php";
}

7.1.2 wendet validate_file() auf den dekodierten Kandidaten an und fügt ein Containment-Gate (_wp_is_template_path_allowed()) hinzu, das jeder aufgelöste Template-Pfad passieren muss.

Vorbedingungen

  1. Das aktive Theme (Child oder Parent - locate_template() prüft beide) liefert ein Top-Level-Verzeichnis, das mit page- beginnt. Legacy-Standardthemes (Twenty Twelve, Twenty Fourteen) und mehrere wp.org-Themes (Neve, Hestia, Sydney) qualifizieren sich. Recherchierte kommerzielle Themes (Divi, Avada, Flatsome, Woodmart, Betheme, The7, Enfold, Salient, Jupiter/X, Porto, Houzez, XStore, Kalium, Uncode) liefern keine - die Traversierung kann nicht aufgelöst werden; siehe PRO_THEME_PAGE_DIRS im PoC für die aus Mirror-Quellen stammende Liste.
  2. Die eingebundene Datei muss auf .php enden (vom Code angehängt).
  3. RCE benötigt zusätzlich register_argc_argv = On und PEARs pearcmd.php.

Im Lab verifizierte operative Hinweise (über die öffentlichen Advisories hinaus)

Das Advisory und der Patchstack-Artikel verzichten darauf, eine funktionierende Anfrage zu veröffentlichen. Diese Details wurden empirisch in diesem Lab ermittelt:

  1. Ein page_id-Anker ist zwingend erforderlich. Ein nicht aufgelöstes pagename kippt is_404, dessen Template get_page_template() vollständig überschattet. Verankern Sie die Query mit einer beliebigen auflösbaren veröffentlichten page_id.
  2. Vollständige Doppelkodierung ist erforderlich. get_posts() schreibt pagename durch sanitize_title_for_query( wp_basename( … ) ) um: rohe .. werden zu -, aber %hex-Sequenzen überleben; das zusätzliche urldecode() in get_page_template() offenbart die Traversierung. Nur %252e/%252f funktioniert.
  3. Pretty Permalinks erzwingen POST (redirect_canonical leitet GET mit 301 um und verwirft die Payload; es kehrt sofort für non-GET/HEAD zurück).
  4. Exakte Tiefe: vier ../ von page-templates/ bei einem Standard-Docroot.
  5. Die Payload löst auch aus dem POST-Body aus (WP führt $_POST in Query- Variablen zusammen) - die Grundlage der WAF-Evasion-Stufen.
  6. pearcmd-Transport-Eigenheiten: PHP urldekodiert $argv-Tokens nicht, und PEARs Config-Serializer escaped beide Anführungszeichen-Stile - daher die rohe, anführungszeichenlose, +-getrennte Probe.

Toolkit

PfadZweck
poc/poc_cve_2026_87902.pyVollständiger PoC: Versions- + WAF-Fingerprinting, Theme/page-*-Ordner-Enumeration (wp.org SVN, Asset-Reference-Discovery, recherchierte Pro-Theme-Map), Anker-Discovery, 8-Varianten-LFI-Oracle, vergleichendes Empty-Body-Fallback-Oracle, --rce-pearcmd-Kette, --lab-Docker-Demo
poc/triage_cve_2026_87902.pyPro-Target- oder Batch-Urteil mit dem benannten fehlschlagenden Gate (EXPLOITABLE / NOT EXPLOITABLE / WAF SUSPECTED / INCONCLUSIVE)
poc/bounty_screen.pyBearbeitet eine in-scope Bug-Bounty-Asset-Liste: crt.sh-Wildcard-Expansion → WP-Filter → Vorbedingungs-Screen → Kandidaten-Übergabe
nuclei/cve-2026-87902.yamlNuclei-Template: sicheres LFI-Oracle (174 Payloads: 10 page-*-Remainder, doppelt/dreifach kodierte Stufen, IDs 1–30)

WAF-Fingerprinting deckt Imperva/Incapsula, Cloudflare, Akamai, AWS CloudFront/WAF, Sucuri, F5 ab. Acht Oracle-Varianten: doppelt kodiert, alternative %25%32%65-Schreibweise, Parameter Pollution, dreifach kodiert - jeweils in Query- String und POST-Body. Multipart-Bodies und Raw-Slash-Payloads wurden getestet und verworfen (WP verarbeitet sie für diesen Sink nicht).

Betroffene und getestete Versionen

VersionBewertung
WordPress 7.1.1LFI + pearcmd RCE end-to-end reproduziert
WordPress 6.5.3 / 5.9.17LFI-Oracle reproduziert
WordPress 4.7.0–7.1.1 (andere Branches)Als betroffen gemeldet; Branch-Tabelle gemäß GHSA
WordPress 7.1.2Gepatchte Negativkontrolle reproduziert

Repository-Layout

root@kitploit:~
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│   └── cve-2026-87902.yaml
└── poc/
    ├── bounty_screen.py
    ├── poc_cve_2026_87902.py
    └── triage_cve_2026_87902.py

Nicht committet: .lab-state, __pycache__/, Screener-Ausgabedateien.

Validierungsgrenzen

BehauptungStatus
Unauthentifizierte LFI außerhalb des Theme-VerzeichnissesBewiesen (7.1.1, 6.5.3, 5.9.17)
RCE via pearcmd.php config-create als Web-BenutzerBewiesen (7.1.1-Lab)
Selbstlöschung der Probe / keine persistenten ArtefakteBewiesen
Gepatchte Negativkontrolle (7.1.2)Bewiesen
Jedes dazwischenliegende betroffene Release getestetNicht getestet
WAF-Bypass-Varianten gegen live kommerzielle WAFsAus dem Lab abgeleitet, nicht WAF-getestet
Root-Privilegien / Container-Escape / Host-KompromittierungNicht beansprucht

Referenzen

  • GHSA-7hp8-65ch-5whp
  • Patchstack: WordPress 7.1.2 security release - unauthenticated LFI to RCE
  • Hadrian: CVE-2026-87902 working PoC - independent reconstruction (bestätigt den page_id-Anker und die Doppelkodierungs-Anforderungen; Quelle des vergleichenden wp-content/index.php-Empty-Body-Oracles, hier als Fallback für gehärtete Sites enthalten)
  • dinosn: cve-2026-87902-wordpress-lfi-lab (unabhängiges Lab, das zu denselben Request-Formen gelangt; Quelle der Nicht-Existenz-Ziel-Kausalitätskontrolle, die nun auf jeden Oracle-Treffer angewendet wird)
  • WordPress 7.1.2 release announcement
  • NVD entry

Schwachstelle gemeldet von Robert Ressl. Dieses Repository ist unabhängige Drittanbieter-Analyse und -Tooling.

Lizenz

MIT - siehe LICENSE.

Sicherheitsgrenze

Führen Sie dieses Repository nur auf Systemen aus, die Sie besitzen oder für die Sie ausdrücklich autorisiert sind zu testen. Der Lab-Treiber lehnt andere Varianten als vulnerable/patched ab, die Python-Treiber lehnen Nicht-Loopback-Ziele ab, es sei denn --allow-authorized-non-loopback wird angegeben, und der Compose-Port ist an 127.0.0.1 gebunden.

Siehe SECURITY.md für die Behandlung von Offenlegungen. Dieses Repository enthält keine Produktionsziele, Kundendaten, Zugriffstoken oder Nachweise aus realen Systemen.

Konkret:

  • Docker veröffentlicht WordPress nur auf 127.0.0.1.
  • Der Standard-PoC-Modus ist ein harmloses LFI-Oracle: es bindet wp-links-opml.php ein, eine Standard-Core-Datei, die ein OPML-Dokument ausgibt.
  • --rce ist Opt-in und schreibt eine anführungszeichenlose, selbstlöschende Marker-Probe (<?=id,unlink(__FILE__)?>) über die öffentlich dokumentierte pearcmd.php config-create-Technik; die Probe entfernt sich selbst bei ihrer einmaligen Ausführung und der PoC verifiziert die Löschung. Keine Shells, Callbacks oder Persistenz.
  • Das Lab wird bei jedem start aus unberührten offiziellen Images neu bereitgestellt; keine Ziel-Instrumentierung.
  • Anfragen sind Single-Host, sequenziell und ratenbegrenzt. Kein Massenscanning.
Tool herunterladen