Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-87902 — WordPress Core <= 7.1.1 LFI non autenticato verso RCE - laboratorio di validazione, PoC, template nuclei (GHSA-7hp8-65ch-5whp) | Kitploit
Strumenti/GitHubGitHub/hassham1/cve-2026-87902
Scanner di VulnerabilitàAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingPaper e RicercaApprendimento e FormazioneSviluppo PayloadLab e Pratica
GitHub
1414h 54m faNon ancora revisionato
hassham1/cve-2026-87902

CVE-2026-87902

WordPress Core <= 7.1.1 LFI non autenticato verso RCE - laboratorio di validazione, PoC, template nuclei (GHSA-7hp8-65ch-5whp)

Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-87902 - WordPress Core LFI non autenticato → Lab di validazione RCE

Materiale di ricerca sulla sicurezza per riprodurre e validare CVE-2026-87902 (GHSA-7hp8-65ch-5whp) in un lab Docker isolato, solo loopback: un local file inclusion non autenticato nella risoluzione dei page-template del core di WordPress, scalabile a remote code execution.

  • Affected: WordPress 4.7.0 through 7.1.1 (every maintained branch)
  • Fixed: 7.1.2 and per-branch 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

Verdetto

Stato: dimostrato nel lab fornito.

WordPress 7.1.1 (tema Twenty Twelve) consente a un attaccante non autenticato di includere file PHP al di fuori della directory del tema tramite la variabile di query pagename, e - con il valore predefinito register_argc_argv = On dell'immagine PHP ufficiale - di scrivere ed eseguire un file marker tramite PEAR pearcmd.php:

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 con la stessa configurazione blocca completamente l'oracolo (controllo negativo). Questo dimostra l'esecuzione di codice come utente del web server WordPress all'interno del container. Non dimostra accesso root, container escape, movimento laterale o compromissione dell'host.

Avvio rapido

Requisiti: Docker con Compose v2, Python 3.10+, accesso di rete a Docker Hub e wordpress.org (installazione del tema).

root@kitploit:~
./lab verify

Questo costruisce il lab vulnerabile, richiede che l'oracolo LFI e il marker RCE scattino, poi costruisce il lab patchato e richiede che l'oracolo rimanga silenzioso.

Per usare un'altra porta loopback: LAB_PORT=9499 ./lab verify.

Rimuovi tutto successivamente con ./lab reset.

Evidenza attesa

Controllo vulnerabile:

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

Controllo patchato:

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

Un HTTP 200, un blocco WAF o un traversal parziale senza il marker dell'oracolo non è accettato come prova.

Ciclo di vita manuale del lab

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

Esegui gli strumenti manualmente contro il lab in esecuzione:

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

Per sistemi di tua proprietà o per cui sei esplicitamente autorizzato a testare (ambito bug-bounty, incarico scritto), i driver richiedono l'override esplicito:

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

Causa principale

get_page_template() in wp-includes/template.php costruisce un nome di file template candidato dalla variabile di query pagename. Il ramo adiacente tre righe sopra passa lo slug del page-template attraverso validate_file(); il ramo pagename non lo faceva mai, e inoltre aggiunge un ulteriore candidato decodificato con urldecode():

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 applica validate_file() al candidato decodificato e aggiunge un gate di contenimento (_wp_is_template_path_allowed()) che ogni percorso template risolto deve superare.

Precondizioni

  1. Il tema attivo (child o parent - locate_template() controlla entrambi) include una directory di primo livello che inizia con page-. I temi predefiniti legacy (Twenty Twelve, Twenty Fourteen) e diversi temi wp.org (Neve, Hestia, Sydney) sono idonei. I temi commerciali analizzati (Divi, Avada, Flatsome, Woodmart, Betheme, The7, Enfold, Salient, Jupiter/X, Porto, Houzez, XStore, Kalium, Uncode) non ne includono nessuna - il traversal non può risolversi; vedi PRO_THEME_PAGE_DIRS nel PoC per la lista basata su mirror.
  2. Il file incluso deve terminare in .php (aggiunto dal codice).
  3. Per RCE servono inoltre register_argc_argv = On e pearcmd.php di PEAR.

Note operative verificate in lab (oltre gli advisory pubblici)

L'advisory e il writeup di Patchstack evitano di pubblicare una richiesta funzionante. Questi dettagli sono stati stabiliti empiricamente in questo lab:

  1. Un anchor page_id è obbligatorio. Un pagename non risolto attiva is_404, il cui template oscura completamente get_page_template(). Ancora la query con qualsiasi page_id pubblicato e risolvibile.
  2. È richiesta la doppia codifica completa. get_posts() riscrive pagename tramite sanitize_title_for_query( wp_basename( … ) ): il .. grezzo diventa -, ma le sequenze %hex sopravvivono; l'urldecode() extra in get_page_template() rivela il traversal. Funziona solo %252e/%252f.
  3. I pretty permalink forzano POST (redirect_canonical fa 301 su GET e scarta il payload; ritorna immediatamente per non-GET/HEAD).
  4. Profondità esatta: quattro ../ da page-templates/ su un docroot standard.
  5. Il payload scatta anche dal body POST (WP unisce $_POST nelle query vars) - la base dei livelli di evasione WAF.
  6. Particolarità del trasporto pearcmd: PHP non fa urldecode dei token $argv, e il serializer di configurazione di PEAR fa escape di entrambi gli stili di quote - da qui la probe grezza, senza quote, separata da +.

Toolkit

PathPurpose
poc/poc_cve_2026_87902.pyPoC completo: fingerprint versione + WAF, enumerazione tema/cartella page-* (wp.org SVN, scoperta asset-reference, mappa pro-theme analizzata), scoperta anchor, oracolo LFI a 8 varianti, oracolo fallback comparativo a corpo vuoto, catena pearcmd --rce, demo docker --lab
poc/triage_cve_2026_87902.pyVerdetto per-target o batch con il gate fallito nominato (EXPLOITABLE / NOT EXPLOITABLE / WAF SUSPECTED / INCONCLUSIVE)
poc/bounty_screen.pyElabora una lista di asset bug-bounty in-scope: espansione wildcard crt.sh → filtro WP → screen precondizioni → handoff candidati
nuclei/cve-2026-87902.yamlTemplate Nuclei: oracolo LFI sicuro (174 payload: 10 remainder page-*, livelli doppio/triplo codificati, id 1–30)

Il fingerprinting WAF copre Imperva/Incapsula, Cloudflare, Akamai, AWS CloudFront/WAF, Sucuri, F5. Otto varianti di oracolo: doppio codificato, spelling alternativo %25%32%65, parameter pollution, triplo codificato - ciascuna in query string e body POST. I body multipart e i payload con slash grezzo sono stati testati e rifiutati (WP non li processa per questo sink).

Versioni affette e testate

VersionAssessment
WordPress 7.1.1LFI + pearcmd RCE riprodotti end to end
WordPress 6.5.3 / 5.9.17oracolo LFI riprodotto
WordPress 4.7.0–7.1.1 (other branches)Segnalate come affette; tabella dei rami per GHSA
WordPress 7.1.2controllo negativo patchato riprodotto

Struttura del repository

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

Non committati: .lab-state, __pycache__/, file di output dello screener.

Limiti di validazione

ClaimStatus
LFI non autenticato al di fuori della directory del temaDimostrato (7.1.1, 6.5.3, 5.9.17)
RCE tramite pearcmd.php config-create come utente webDimostrato (lab 7.1.1)
Auto-cancellazione della probe / nessun artefatto persistenteDimostrato
Controllo negativo patchato (7.1.2)Dimostrato
Ogni release intermedia affetta testataNon testata
Varianti di bypass WAF contro WAF commerciali liveDerivate dal lab, non testate su WAF
Privilegi root / container escape / compromissione hostNon rivendicati

Riferimenti

  • GHSA-7hp8-65ch-5whp
  • Patchstack: WordPress 7.1.2 security release - unauthenticated LFI to RCE
  • Hadrian: CVE-2026-87902 working PoC - independent reconstruction (conferma l'anchor page_id e i requisiti di doppia codifica; fonte dell'oracolo comparativo a corpo vuoto wp-content/index.php, incluso qui come fallback per siti hardened)
  • dinosn: cve-2026-87902-wordpress-lfi-lab (lab indipendente che arriva alle stesse forme di richiesta; fonte del controllo di causalità su target inesistente ora applicato a ogni hit dell'oracolo)
  • WordPress 7.1.2 release announcement
  • NVD entry

Vulnerabilità segnalata da Robert Ressl. Questo repository è analisi e tooling indipendenti di terze parti.

Licenza

MIT - vedi LICENSE.

Limite di sicurezza

Esegui questo repository solo su sistemi di tua proprietà o per cui sei esplicitamente autorizzato a testare. Il driver del lab rifiuta varianti diverse da vulnerable/patched, i driver Python rifiutano target non-loopback a meno che non venga fornito --allow-authorized-non-loopback, e la porta Compose è vincolata a 127.0.0.1.

Vedi SECURITY.md per la gestione della divulgazione. Questo repository non include target di produzione, dati dei clienti, token di accesso o evidenze da sistemi reali.

Concretamente:

  • Docker pubblica WordPress solo su 127.0.0.1.
  • La modalità PoC predefinita è un oracolo LFI innocuo: include wp-links-opml.php, un file core stock che stampa un documento OPML.
  • --rce è opt-in e scrive una probe marker senza quote e auto-cancellante (<?=id,unlink(__FILE__)?>) tramite la tecnica config-create di pearcmd.php pubblicamente documentata; la probe si rimuove da sola alla sua singola esecuzione e il PoC verifica la cancellazione. Nessuna shell, callback o persistenza.
  • Il lab si riprovisiona da immagini ufficiali pristine a ogni start; nessuna strumentazione del target.
  • Le richieste sono single-host, sequenziali e rate-limited. Nessuna scansione di massa.
Scarica lo strumento