Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
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.

FeedContattoPrivacy© 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
23324 giorni 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:

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).

./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:

[+] 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:

[=] 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

./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:

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:

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():

// 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

Scarica lo strumento