
🔐 CVE-2026-57821 - Apache Fineract SQL Injection Toolkit 📚 نصّان بلغة بايثون للاختبار الأمني المصرح به: verifier.py (كشف آمن دون استخراج) وexploit.py (تحليل عميق). يدعم 11 نوعًا من قواعد البيانات. مثالي لفهم ثغرات حقن SQL. اختبارات قانونية فقط ⚠️ لأغراض تعليمية وبحثية فقط.

إشعار قانوني وأخلاقي تُقدَّم مجموعة الأدوات هذه حصريًا لأغراض التعليم والتدريب واختبار الأمان المصرَّح به. يُعدّ الاستخدام غير المصرَّح به ضد أي نظام دون إذن كتابي صريح غير قانوني وينتهك قوانين الجرائم الحاسوبية. لا يتحمّل المؤلف أي مسؤولية عن سوء الاستخدام أو الأضرار. أنت وحدك المسؤول عن أفعالك.
CVE-2026-57821 هي ثغرة حقن SQL اكتُشفت في نقطة نهاية واجهة برمجة تطبيقات عرض المكاتب في Apache Fineract.
| السمة | التفصيل |
|---|---|
| نقطة النهاية | /api/v1/offices |
| المعامل | orderBy |
| الطريقة | GET |
| المصادقة المطلوبة | نعم (المستخدمون المصادَق عليهم فقط) |
| الإصدارات المتأثرة | Apache Fineract ≤ 1.14.0 |
| الإصدار المُصحَّح | Apache Fineract 1.15.0 |
توجد الثغرة لأن المعامل orderBy يُضمَّن مباشرةً في استعلامات SQL دون تنقية مناسبة. يمكن للمهاجم الذي يمتلك بيانات اعتماد صالحة أن يحقن استعلامات فرعية محاطة بأقواس () داخل المعامل orderBy.
سبب تجاوز هذا للإصلاحات السابقة:
ColumnValidator لتنقية جمل ORDER BYORDER BYمثال على ناقل الهجوم:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
| التأثير | الوصف |
|---|---|
| تسريب البيانات | يمكن لحقن SQL الأعمى القائم على الوقت استخراج محتوى حساس من قاعدة البيانات |
| حجب الخدمة | يمكن للاستعلامات الثقيلة استنزاف موارد مجمّع الاتصالات |
| الكشف عن المعلومات | يمكن لتقنيات قائمة على الأخطاء كشف بنية قاعدة البيانات وبياناتها |
| السمة | التفصيل |
|---|---|
| المكتشف / المُبلِّغ | Terence Monteiro (Apache Fineract Team) |
| تاريخ الإفصاح العام | 14 يوليو 2026 |
| الإصدار المُصحَّح | Apache Fineract 1.15.0 |
| الإعلان الرسمي | Apache Mailing List |
| إصلاح GitHub | PR #6048 |
تكتشف مجموعة الأدوات هذه تلقائيًا تقنيات الاستغلال وتتكيّف معها لـ 11 خلفية قاعدة بيانات مختلفة:
| قاعدة البيانات | طريقة الاكتشاف | تقنية الاستغلال |
|---|---|---|
| PostgreSQL | قائم على الوقت (pg_sleep) | حقن أعمى قائم على الوقت |
| MySQL | قائم على الوقت (SLEEP) | حقن أعمى قائم على الوقت |
| MariaDB | قائم على الوقت + @@version_comment | حقن أعمى قائم على الوقت |
| MSSQL | قائم على الأخطاء (فشل CONVERT) | قائم على الأخطاء |
| Oracle | قائم على الوقت (DBMS_LOCK.SLEEP) | حقن أعمى قائم على الوقت |
| SQLite | استعلام ثقيل (Cartesian Join) | قائم على الوقت (ثقيل) |
| Firebird | استعلام ثقيل (Cartesian Join) | قائم على الوقت (ثقيل) |
| DB2 | استعلام ثقيل (Cartesian Join) | قائم على الوقت (ثقيل) |
| Informix | استعلام ثقيل (Cartesian Join) | قائم على الوقت (ثقيل) |
| H2 | استعلام ثقيل (Cartesian Join) | قائم على الوقت (ثقيل) |
| غير معروف (عام) | الرجوع إلى PostgreSQL | قائم على الوقت |
يوفّر هذا المشروع نصّي Python لسيناريوهات تقييم أمني مختلفة:
verifier.py – أداة تحقق آمنة ومصغّرةالغرض: إثبات وجود الثغرة بسرعة دون استخراج أي بيانات.
ما تفعله:
VULNERABLE أو NOT VULNERABLE لكل نوع من أنواع قواعد البياناتالمزايا:
حالة الاستخدام: تقييم أولي لتحديد ما إذا كان الهدف مصابًا بالثغرة.
exploit.py – محلل أمني شاملالغرض: استغلال الثغرة بالكامل لاستخراج معلومات قاعدة البيانات.
ما الذي يفعله:
المزايا:
حالة الاستخدام: تحليل أمني متعمّق بعد تأكيد وجود الثغرة.
الفرق الجوهري: يخبرك
verifierPoC.pyما إذا كانت الثغرة موجودة؛ بينما يُظهر لكexploit.pyما يمكن استخراجه. وكلاهما يؤدي دورين متمايزين لكن متكاملين في سير عمل التقييم الأمني.
requestspip install requests
حرّر المتغيرات التالية في أعلى كلا السكربتين:
| المتغير | الوصف | القيمة الافتراضية |
|---|---|---|
TARGET | عنوان URL لواجهة Fineract API | http://localhost:8080/fineract-provider/api/v1/offices |
USERNAME | اسم المستخدم لمصادقة API | mifos |
PASSWORD | كلمة المرور لمصادقة API | password |
TENANT_ID | معرّف المستأجر | default |
BASE_SLEEP | مدة الانتظار للاختبارات الزمنية (exploit.py) | 6 |
SLEEP_SECONDS | مدة الانتظار للاختبارات الزمنية (verifier.py) | 5 |
TIMEOUT | مهلة طلب HTTP | 25 (exploit) / 15 (verifier) |
MAX_RETRIES | عدد مرات إعادة المحاولة للطلبات الفاشلة | 2 |
exploit.py - فحص عميق
python3 exploit.py
المخرجات المتوقعة:
CVE-2026-57821 - Apache Fineract Vulnerability Verifier
══════════════════════════════════════════════════════════════════════════════════════
@tc4dy is here :) Good Luck!
CONNECTION SUCCESS
BASELINE: 0.234s
STARTING VULNERABILITY VERIFICATION
VERIFICATION RESULTS
PostgreSQL: VULNERABLE
MySQL: NOT VULNERABLE
MariaDB: NOT VULNERABLE
Oracle: NOT VULNERABLE
MSSQL: NOT VULNERABLE
CONCLUSION: TARGET IS VULNERABLE (CVE-2026-57821 CONFIRMED)
Interpretation: If VULNERABLE appears for any database type, the target is affected.
درجة CVSS المقياس القيمة درجة CVSS v3.1 الأساسية 8.1 (عالية) المتجه CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H متجه الهجوم الشبكة الامتيازات المطلوبة منخفضة تفاعل المستخدم لا يوجد درجة EPSS
0.29% (احتمالية الاستغلال خلال 30 يومًا)
تعيين CWE
CWE‑89: عدم تحييد العناصر الخاصة المستخدمة في أمر SQL بشكل صحيح ('حقن SQL')
لماذا تنجح الحمولة
الكود المصاب في Apache Fineract 1.14.0:
// Simplified vulnerable logic
String orderBy = request.getParameter("orderBy");
if (ColumnValidator.isValid(orderBy)) {
// VALIDATOR FAILS FOR: "(SELECT ...)"
// Only checks against simple column names
String sql = "SELECT * FROM offices ORDER BY " + orderBy;
// Executes query with user input directly
}
مثال على حمولة المهاجم:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
SQL الناتج:
SELECT * FROM offices ORDER BY (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)
يتحقق ColumnValidator من أسماء الأعمدة لكنه يغفل الاستعلام الفرعي المتداخل، مما يسمح بتنفيذ SQL عشوائي.
| الإجراء | الأولوية |
|---|---|
| الترقية إلى Apache Fineract 1.15.0+ | حرجة |
| تطبيق رقعة PR #6048 | حرجة |
قاعدة WAF: حظر orderBy الذي يحتوي على (SELECT، SLEEP(، pg_sleep(، WAITFOR | عالية |
مراقبة السجلات بحثًا عن orderBy يحتوي على أقواس أو كلمات مفتاحية للاستعلامات الفرعية | عالية |
| مراقبة تجمع اتصالات قاعدة البيانات لاكتشاف استنفاد الموارد | متوسطة |