🔐 CVE-2026-57821 - Apache Fineract SQL Injection Toolkit 📚 Due script Python per test di sicurezza autorizzati: verifier.py (rilevamento sicuro, nessuna estrazione) e exploit.py (analisi approfondita). Supporta 11 tipi di DB. Perfetto per comprendere le vulnerabilità di SQL injection. Solo test legali ⚠️ esclusivamente per scopi educativi e di ricerca.

⚠️ AVVISO LEGALE ED ETICO
Questo toolkit è fornito esclusivamente a scopo educativo, formativo e per test di sicurezza autorizzati.
L'uso non autorizzato contro qualsiasi sistema senza esplicita autorizzazione scritta è illegale e viola le leggi sui crimini informatici.
L'autore non si assume alcuna responsabilità per uso improprio o danni.
Sei l'unico responsabile delle tue azioni.
CVE-2026-57821 è una vulnerabilità di SQL Injection scoperta nell'endpoint API di elenco uffici di Apache Fineract.
| Attributo | Dettaglio |
|---|
| Endpoint | /api/v1/offices |
| Parametro | orderBy |
| Metodo | GET |
| Autenticazione Richiesta | Sì (solo utenti autenticati) |
| Versioni Affette | Apache Fineract ≤ 1.14.0 |
| Versione Corretta | Apache Fineract 1.15.0 |
La vulnerabilità esiste perché il parametro orderBy viene incorporato direttamente nelle query SQL senza una corretta sanitizzazione. Un attaccante con credenziali valide può iniettare sottoquery racchiuse tra parentesi () nel parametro orderBy.
Perché questo bypassa le correzioni precedenti:
ColumnValidator per sanificare le clausole ORDER BYORDER BYEsempio di Vettore d'Attacco:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
| Impatto | Descrizione |
|---|---|
| Esfiltrazione Dati | SQL injection blind basata sul tempo può estrarre contenuti sensibili del database |
| Denial of Service | Query pesanti possono esaurire le risorse del pool di connessioni |
| Divulgazione Informazioni | Tecniche basate su errori possono rivelare la struttura del database e i dati |
| Attributo | Dettaglio |
|---|---|
| Scopritore / Reporter | Terence Monteiro (Team Apache Fineract) |
| Data di Divulgazione Pubblica | 14 luglio 2026 |
| Versione Corretta | Apache Fineract 1.15.0 |
| Annuncio Ufficiale | Mailing List Apache |
| Fix su GitHub | PR #6048 |
Questo toolkit rileva e adatta automaticamente le tecniche di sfruttamento per 11 diversi back-end di database:
| Database | Metodo di Rilevamento | Tecnica di Sfruttamento |
|---|---|---|
| PostgreSQL | Basato sul tempo (pg_sleep) | Blind basato sul tempo |
| MySQL | Basato sul tempo (SLEEP) | Blind basato sul tempo |
| MariaDB | Basato sul tempo + @@version_comment | Blind basato sul tempo |
| MSSQL | Basato su errori (fallimento CONVERT) | Basato su errori |
| Oracle | Basato sul tempo (DBMS_LOCK.SLEEP) | Blind basato sul tempo |
| SQLite | Query pesante (Join Cartesiano) | Basato sul tempo (Pesante) |
| Firebird | Query pesante (Join Cartesiano) | Basato sul tempo (Pesante) |
| DB2 | Query pesante (Join Cartesiano) | Basato sul tempo (Pesante) |
| Informix | Query pesante (Join Cartesiano) | Basato sul tempo (Pesante) |
| H2 | Query pesante (Join Cartesiano) | Basato sul tempo (Pesante) |
| Sconosciuto (Generico) | Fallback a PostgreSQL | Basato sul tempo |
Questo progetto fornisce due script Python per diversi scenari di valutazione della sicurezza:
verifier.py – Strumento di Verifica Sicuro e MinimoScopo: Dimostrare rapidamente l'esistenza della vulnerabilità senza estrarre dati.
Cosa fa:
VULNERABILE o NON VULNERABILE per ogni tipo di database✅ Vantaggi:
📋 Caso d'Uso: Valutazione iniziale per determinare se il target è vulnerabile.
exploit.py – Analizzatore di Sicurezza CompletoScopo: Sfruttare completamente la vulnerabilità per estrarre informazioni dal database.
Cosa fa:
✅ Vantaggi:
📋 Caso d'Uso: Analisi di sicurezza approfondita dopo la conferma della vulnerabilità.
🔍 Differenza Chiave:
verifier.pyti dice se è vulnerabile;exploit.pyti mostra cosa può essere estratto. Entrambi svolgono ruoli distinti ma complementari in un flusso di lavoro di valutazione della sicurezza.
requestspip install requests
Modifica le seguenti variabili all'inizio di entrambi gli script:
| Variabile | Descrizione | Default |
|---|---|---|
TARGET | URL API di Fineract | http://localhost:8080/fineract-provider/api/v1/offices |
USERNAME | Nome utente per l'autenticazione API | mifos |
PASSWORD | Password per l'autenticazione API | password |
TENANT_ID | Identificativo tenant | default |
BASE_SLEEP | Durata del sonno per test basati sul tempo (exploit.py) | 6 |
SLEEP_SECONDS | Durata del sonno per test basati sul tempo (verifier.py) | 5 |
TIMEOUT | Timeout richiesta HTTP | 25 (exploit) / 15 (verifier) |
MAX_RETRIES | Numero di tentativi per richieste fallite | 2 |
1️⃣ exploit.py - Scansione Approfondita
python3 exploit.py
Output Previsto:
CVE-2026-57821 - Apache Fineract Vulnerability Verifier
══════════════════════════════════════════════════════════════════════════════════════
@tc4dy is here :) Good Luck!
CONNESSIONE RIUSCITA
BASELINE: 0.234s
INIZIO VERIFICA VULNERABILITÀ
RISULTATI VERIFICA
PostgreSQL: VULNERABILE
MySQL: NON VULNERABILE
MariaDB: NON VULNERABILE
Oracle: NON VULNERABILE
MSSQL: NON VULNERABILE
CONCLUSIONE: IL TARGET È VULNERABILE (CVE-2026-57821 CONFERMATO)
Interpretazione: Se VULNERABILE appare per qualsiasi tipo di database, il target è affetto.
Punteggio CVSS
| Metrica | Valore |
|---|---|
| Punteggio Base CVSS v3.1 | 8.1 (Alto) |
| Vettore | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H |
| Vettore d'Attacco | Rete |
| Privilegi Richiesti | Basso |
| Interazione dell'Utente | Nessuna |
| Punteggio EPSS |
0.29% (probabilità di sfruttamento entro 30 giorni)
Mappatura CWE
CWE‑89: Neutralizzazione Impropria di Elementi Speciali usati in un Comando SQL ('SQL Injection')
Perché il Payload Funziona
Il codice vulnerabile in Apache Fineract 1.14.0:
// Logica vulnerabile semplificata
String orderBy = request.getParameter("orderBy");
if (ColumnValidator.isValid(orderBy)) {
// IL VALIDATOR FALLISCE PER: "(SELECT ...)"
// Controlla solo nomi di colonne semplici
String sql = "SELECT * FROM offices ORDER BY " + orderBy;
// Esegue la query con input utente direttamente
}
Esempio di Payload dell'Attaccante:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
SQL Risultante:
SELECT * FROM offices ORDER BY (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)
Il ColumnValidator controlla i nomi delle colonne ma non rileva la sottoquery annidata, consentendo l'esecuzione arbitraria di SQL.
| Azione | Priorità |
|---|---|
| Aggiornare a Apache Fineract 1.15.0+ | 🔴 Critica |
| Applicare la patch PR #6048 | 🔴 Critica |
Regola WAF: Bloccare orderBy contenente (SELECT, SLEEP(, pg_sleep(, WAITFOR | 🟠 Alta |
Monitorare i log per orderBy con parentesi o parole chiave di sottoquery | 🟠 Alta |
| Monitoraggio del pool di connessioni del database per rilevare esaurimento risorse | 🟡 Media |