
🔐 CVE-2026-57821 - Apache Fineract SQL Injection Toolkit 📚 Deux scripts Python pour des tests de sécurité autorisés : verifier.py (détection sûre, sans extraction) et exploit.py (analyse approfondie). Prend en charge 11 types de bases de données. Idéal pour comprendre les vulnérabilités d'injection SQL. Tests légaux uniquement ⚠️ à des fins éducatives et de recherche uniquement.

⚠️ AVIS LÉGAL ET ÉTHIQUE
Ce kit est fourni strictement à des fins éducatives, de formation et de tests de sécurité autorisés.
Toute utilisation non autorisée contre un système sans autorisation écrite explicite est illégale et viole les lois relatives à la cybercriminalité.
L'auteur décline toute responsabilité en cas d'usage abusif ou de dommages.
Vous êtes seul responsable de vos actions.
CVE-2026-57821 est une vulnérabilité de type Injection SQL découverte dans le point de terminaison de l'API de liste des bureaux d'Apache Fineract.
| Attribut | Détail |
|---|---|
| Point de terminaison | /api/v1/offices |
| Paramètre | orderBy |
| Méthode | GET |
| Authentification requise | Oui (utilisateurs authentifiés uniquement) |
| Versions affectées | Apache Fineract ≤ 1.14.0 |
| Version corrigée | Apache Fineract 1.15.0 |
La vulnérabilité existe parce que le paramètre orderBy est directement intégré dans les requêtes SQL sans assainissement approprié. Un attaquant disposant d'identifiants valides peut injecter des sous-requêtes entourées de parenthèses () dans le paramètre orderBy.
Pourquoi cela contourne les correctifs précédents :
ColumnValidator pour assainir les clauses ORDER BYORDER BYExemple de vecteur d'attaque :
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
| Impact | Description |
|---|---|
| Exfiltration de données | L'injection SQL aveugle basée sur le temps peut extraire un contenu sensible de la base de données |
| Déni de service | Les requêtes lourdes peuvent épuiser les ressources du pool de connexions |
Ce kit détecte et adapte automatiquement les techniques d'exploitation pour 11 moteurs de bases de données différents :
Ce projet fournit deux scripts Python pour différents scénarios d'évaluation de sécurité :
verifier.py – Outil de vérification sûr et minimalObjectif : Prouver rapidement l'existence de la vulnérabilité sans extraire de données.
Ce qu'il fait :
VULNERABLE ou NOT VULNERABLE pour chaque type de base de données✅ Avantages :
📋 Cas d'usage : Évaluation de premier passage pour déterminer si la cible est vulnérable.
exploit.py – Analyseur de sécurité completObjectif : Exercer pleinement la vulnérabilité pour extraire des informations de la base de données.
Ce qu'il fait :
✅ Avantages :
📋 Cas d'usage : Analyse de sécurité approfondie après confirmation de la vulnérabilité.
🔍 Différence clé :
verifierPoC.pyvous indique si c'est vulnérable ;exploit.pyvous montre ce qui peut être extrait. Les deux jouent des rôles distincts mais complémentaires dans un flux de travail d'évaluation de sécurité.
requestspip install requests
Modifiez les variables suivantes en haut des deux scripts :
1️⃣ exploit.py - Analyse approfondie
python3 exploit.py
Sortie attendue :
CVE-2026-57821 - Apache Fineract Vulnerability Verifier
══════════════════════════════════════════════════════════════════════════════════════
@tc4dy is here :) Good Luck!
CONNECTION SUCCESS
BASELINE: 0.234s
STARTING VULNERABILITY VERIFICATION
VERIFICATION RESULTS
PostgreSQL: VULNERABLE
MySQL: NOT VULNERABLE
MariaDB: NOT VULNERABLE
Oracle: NOT VULNERABLE
MSSQL: NOT VULNERABLE
CONCLUSION: TARGET IS VULNERABLE (CVE-2026-57821 CONFIRMED)
Interpretation: If VULNERABLE appears for any database type, the target is affected.
Score CVSS Mesure Valeur Score de base CVSS v3.1 8,1 (Élevé) Vecteur CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H Vecteur d'attaque Réseau Privilèges requis Faible Interaction de l'utilisateur Aucune Score EPSS
0,29 % (probabilité d'exploitation dans les 30 jours)
Correspondance CWE
CWE-89 : Neutralisation incorrecte d'éléments spéciaux utilisés dans une commande SQL ('Injection SQL')
Pourquoi la charge utile fonctionne
Le code vulnérable dans Apache Fineract 1.14.0 :
// Simplified vulnerable logic
String orderBy = request.getParameter("orderBy");
if (ColumnValidator.isValid(orderBy)) {
// VALIDATOR FAILS FOR: "(SELECT ...)"
// Only checks against simple column names
String sql = "SELECT * FROM offices ORDER BY " + orderBy;
// Executes query with user input directly
}
Exemple de charge utile de l'attaquant :
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
SQL résultant :
SELECT * FROM offices ORDER BY (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)
Le ColumnValidator vérifie les noms de colonnes mais manque la sous-requête imbriquée, permettant l'exécution arbitraire de SQL.
| Divulgation d'informations |
| Les techniques basées sur les erreurs peuvent révéler la structure et les données de la base |
| Attribut | Détail |
|---|
| Découvreur / Rapporteur | Terence Monteiro (équipe Apache Fineract) |
| Date de divulgation publique | 14 juillet 2026 |
| Version corrigée | Apache Fineract 1.15.0 |
| Annonce officielle | Liste de diffusion Apache |
| Correctif GitHub | PR #6048 |
| Base de données | Méthode de détection | Technique d'exploitation |
|---|
| PostgreSQL | Basée sur le temps (pg_sleep) | Aveugle basée sur le temps |
| MySQL | Basée sur le temps (SLEEP) | Aveugle basée sur le temps |
| MariaDB | Basée sur le temps + @@version_comment | Aveugle basée sur le temps |
| MSSQL | Basée sur les erreurs (échec de CONVERT) | Basée sur les erreurs |
| Oracle | Basée sur le temps (DBMS_LOCK.SLEEP) | Aveugle basée sur le temps |
| SQLite | Requête lourde (jointure cartésienne) | Basée sur le temps (lourde) |
| Firebird | Requête lourde (jointure cartésienne) | Basée sur le temps (lourde) |
| DB2 | Requête lourde (jointure cartésienne) | Basée sur le temps (lourde) |
| Informix | Requête lourde (jointure cartésienne) | Basée sur le temps (lourde) |
| H2 | Requête lourde (jointure cartésienne) | Basée sur le temps (lourde) |
| Inconnue (générique) | Repli sur PostgreSQL | Basée sur le temps |
| Variable | Description | Défaut |
|---|
TARGET | URL de l'API Fineract | http://localhost:8080/fineract-provider/api/v1/offices |
USERNAME | Nom d'utilisateur d'authentification API | mifos |
PASSWORD | Mot de passe d'authentification API | password |
TENANT_ID | Identifiant du locataire | default |
BASE_SLEEP | Durée d'attente pour les tests basés sur le temps (exploit.py) | 6 |
SLEEP_SECONDS | Durée d'attente pour les tests basés sur le temps (verifier.py) | 5 |
TIMEOUT | Délai d'expiration des requêtes HTTP | 25 (exploit) / 15 (verifier) |
MAX_RETRIES | Nombre de nouvelles tentatives pour les requêtes échouées | 2 |
| Action | Priorité |
|---|
| Mettre à niveau vers Apache Fineract 1.15.0+ | 🔴 Critique |
| Appliquer le correctif PR #6048 | 🔴 Critique |
Règle WAF : Bloquer orderBy contenant (SELECT, SLEEP(, pg_sleep(, WAITFOR | 🟠 Élevée |
Surveiller les journaux pour orderBy avec parenthèses ou mots-clés de sous-requête | 🟠 Élevée |
| Surveillance du pool de connexions de la base pour détecter l'épuisement des ressources | 🟡 Moyenne |