
CVE-2025-68147 के लिए PoC रिपॉजिटरी: OpenSourcePOS में संग्रहीत क्रॉस-साइट स्क्रिप्टिंग (XSS)। यह भेद्यता Store Config मॉड्यूल में दुर्भावनापूर्ण JavaScript इंजेक्शन के माध्यम से विशेषाधिकार वृद्धि (privilege escalation) की अनुमति देती है। इसमें पेलोड विवरण और पैच सत्यापन (v3.4.0) शामिल है। सुरक्षा शोधकर्ता: Aditya Singh (Nixon-H)।
| मेटाडेटा | विवरण |
|---|---|
| CVE आईडी | CVE-2025-68147 |
| गंभीरता | उच्च CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N |
| भेद्यता प्रकार | स्टोर्ड क्रॉस-साइट स्क्रिप्टिंग (CWE-79) |
| प्रभावित संस्करण | OpenSourcePOS v3.4.0, v3.4.1 |
| पैच किया गया संस्करण | v3.4.2 |
| भेद्य घटक | स्टोर कॉन्फ़िगरेशन मॉड्यूल (रिटर्न पॉलिसी फ़ील्ड) |
| रिपोर्टकर्ता | Aditya Singh (Nixon-H) |
OpenSourcePOS के स्टोर कॉन्फ़िगरेशन मॉड्यूल में एक स्टोर्ड क्रॉस-साइट स्क्रिप्टिंग (XSS) भेद्यता की खोज की गई। एप्लिकेशन ospos_app_config डेटाबेस टेबल में संग्रहीत करने से पहले "रिटर्न पॉलिसी" फ़ील्ड में उपयोगकर्ता-आपूर्ति किए गए इनपुट को ठीक से सैनिटाइज़ करने में विफल रहा।
इस दोष ने कॉन्फ़िगरेशन विशेषाधिकारों वाले एक प्रमाणित हमलावर (या एक अलग CSRF श्रृंखला का शोषण करने वाले हमलावर) को मनमाना JavaScript पेलोड इंजेक्ट करने की अनुमति दी। चूंकि "रिटर्न पॉलिसी" प्रत्येक बिक्री रसीद पर गतिशील रूप से प्रस्तुत की जाती है, इसलिए इंजेक्ट किया गया पेलोड किसी भी उपयोगकर्ता के ब्राउज़र में स्वचालित रूप से निष्पादित होता है—जिसमें निम्न-विशेषाधिकार वाले कैशियर, अन्य व्यवस्थापक, या ग्राहक शामिल हैं—जब भी रसीद उत्पन्न या देखी जाती है।
यह भेद्यता रसीद व्यू टेम्पलेट में स्थित है: app/Views/sales/receipt_default.php।
एप्लिकेशन वैश्विक कॉन्फ़िगरेशन सरणी ($this->config['return_policy']) से "रिटर्न पॉलिसी" स्ट्रिंग प्राप्त करता है और इसे प्रदर्शन के लिए तैयार करता है।
<br>) में बदलने के लिए मूल PHP फ़ंक्शन nl2br() का उपयोग किया।nl2br() HTML विशेष वर्णों को सैनिटाइज़ नहीं करता। यह <script>, `` जैसे टैग और onload विशेषताओं को पूरी तरह से अक्षुण्ण छोड़ देता है।भेद्य कोड (पैच से पहले):
<div id="sale_return_policy">
<?php echo nl2br($this->config['return_policy']); ?>
</div>
जब कोई व्यवस्थापक कॉन्फ़िगरेशन सहेजता है, तो पेलोड डेटाबेस में कच्चे रूप में संग्रहीत होता है।
ospos_app_configreturn_policyPolicy Text... <script>alert('XSS')</script>चूंकि कंट्रोलर साइड (Config.php) पर कोई इनपुट सैनिटाइज़ेशन नहीं है और व्यू साइड (receipt_default.php) पर कोई आउटपुट एस्केपिंग नहीं है, इसलिए एप्लिकेशन स्टोर्ड XSS के प्रति भेद्य है।
यह हमला स्टोर कॉन्फ़िगरेशन पैनल को लक्षित करता है लेकिन सेल्स/रसीद मॉड्यूल को प्रभावित करता है।
http://[TARGET]/config (कॉन्फ़िगरेशन सहेजने के लिए POST अनुरोध)http://[TARGET]/sales/receipt/[SALE_ID]चरण 1: इंजेक्शन हमने एक व्यवस्थापक के रूप में लॉग इन किया और स्टोर कॉन्फ़िगरेशन -> सामान्य पर नेविगेट किया। "रिटर्न पॉलिसी" टेक्स्ट क्षेत्र में, हमने निम्नलिखित विशिष्ट पेलोड इंजेक्ट किया:
Standard Return Policy: No Refunds.
<script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
चरण 2: स्थायित्व
"सबमिट" पर क्लिक करने पर, एप्लिकेशन ने /config/save को एक POST अनुरोध भेजा। पेलोड सफलतापूर्वक डेटाबेस में दर्ज हो गया।
चरण 3: ट्रिगर अन्य उपयोगकर्ताओं पर प्रभाव सत्यापित करने के लिए:
http://localhost/sales/receipt/1)। ब्राउज़र return_policy div को पार्स करता है, <script> टैग का सामना करता है, और तुरंत JavaScript निष्पादित करता है।देखा गया परिणाम:
संदेश के साथ एक ब्राउज़र अलर्ट बॉक्स दिखाई दिया: XSS_BY_NIXON_SUCCESSFUL।
स्क्रीनशॉट 1: अलर्ट ट्रिगर
स्क्रीनशॉट 2: कॉन्फ़िगरेशन में पेलोड
🎥 वीडियो प्रदर्शन: PoC वीडियो डाउनलोड करने / देखने के लिए क्लिक करें
यह एक स्कोप चेंज्ड (S:C) भेद्यता है क्योंकि हमला सर्वर पर संग्रहीत होता है लेकिन पीड़ित के ब्राउज़र संदर्भ में निष्पादित होता है।
/sales/receipt/105)। स्क्रिप्ट चुपचाप निष्पादित होती है, document.cookie (जिसमें ospos_session आईडी होती है) को हमलावर के सर्वर पर भेजती है।/employees/save पर एक छिपा हुआ POST अनुरोध भेजने के लिए मजबूर करती है।hacker / password123) बन जाता है। पीड़ित को रसीद के अलावा कुछ नहीं दिखता, जबकि हमलावर को स्थायी बैकडोर मिल जाता है।इस भेद्यता को OpenSourcePOS v3.4.2 में ठीक कर दिया गया था।
मेंटेनर ने एक पैच लागू किया जो संदर्भ-जागरूक आउटपुट एन्कोडिंग (Context-Aware Output Encoding) लागू करता है। कॉन्फ़िगरेशन मान अब nl2br() को पास करने से पहले CodeIgniter के वैश्विक esc() हेल्पर फ़ंक्शन में लपेटा जाता है।
पैच (कमिट 22297a):
<div id="sale_return_policy">
<?php echo nl2br(esc($this->config['return_policy'])); ?>
</div>
सत्यापन: v3.4.2 में अपग्रेड करने के बाद, वही पेलोड हानिरहित टेक्स्ट के रूप में प्रस्तुत होता है:
Standard Return Policy: No Refunds. <script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
22297a) और शोधकर्ता द्वारा सत्यापित किया गया।