🔐 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 per scopi educativi, di formazione e di test di sicurezza autorizzati.
L'uso non autorizzato contro qualsiasi sistema senza esplicito permesso scritto è illegale e viola le leggi sui reati 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 degli uffici di Apache Fineract.
| Attributo | Dettaglio |
|---|---|
| Endpoint | /api/v1/offices |
| Parametro | orderBy |
| Metodo | GET |
| Autenticazione richiesta | Sì (solo utenti autenticati) |
| Versioni interessate | 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 aggira le correzioni precedenti:
ColumnValidator per sanitizzare le clausole ORDER BYORDER BYEsempio di vettore di 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 di dati | La SQL injection cieca basata sul tempo può estrarre contenuti sensibili del database |
| Denial of Service | Query pesanti possono esaurire le risorse del pool di connessioni |
| Divulgazione di informazioni | Le tecniche basate sugli errori possono rivelare la struttura del database e i dati |
| Attributo | Dettaglio |
|---|---|
| Scopritore / Segnalatore | Terence Monteiro (Apache Fineract Team) |
| Data di divulgazione pubblica | 14 luglio 2026 |
| Versione corretta | Apache Fineract 1.15.0 |
| Annuncio ufficiale | Apache Mailing List |
| Correzione su GitHub | PR #6048 |
Questo toolkit rileva e adatta automaticamente le tecniche di sfruttamento per 11 diversi backend di database:
| Database | Metodo di rilevamento | Tecnica di sfruttamento |
|---|---|---|
| PostgreSQL | Basato sul tempo (pg_sleep) | Blind basata sul tempo |
| MySQL | Basato sul tempo (SLEEP) | Blind basata sul tempo |
| MariaDB | Basato sul tempo + @@version_comment | Blind basata sul tempo |
| MSSQL | Basato sugli errori (fallimento di CONVERT) | Basata sugli errori |
| Oracle | Basato sul tempo (DBMS_LOCK.SLEEP) | Blind basata sul tempo |
| SQLite | Query pesante (Join cartesiano) | Basata sul tempo (pesante) |
| Firebird | Query pesante (Join cartesiano) | Basata sul tempo (pesante) |
| DB2 | Query pesante (Join cartesiano) | Basata sul tempo (pesante) |
| Informix | Query pesante (Join cartesiano) | Basata sul tempo (pesante) |
| H2 | Query pesante (Join cartesiano) | Basata sul tempo (pesante) |
| Sconosciuto (generico) | Fallback a PostgreSQL | Basata sul tempo |
Questo progetto fornisce due script Python per diversi scenari di valutazione della sicurezza:
verifier.py – Strumento di verifica sicuro e minimaleScopo: Dimostrare rapidamente l'esistenza della vulnerabilità senza estrarre dati.
Cosa fa:
VULNERABLE o NOT VULNERABLE per ciascun tipo di database** Vantaggi:**
** Caso d'uso:** Valutazione di primo passaggio 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:**
verifierPoC.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 | Valore predefinito |
|---|---|---|
TARGET | URL dell'API 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 | Identificatore del tenant | default |
BASE_SLEEP | Durata dell'attesa per i test basati sul tempo (exploit.py) | 6 |
SLEEP_SECONDS | Durata dell'attesa per i test basati sul tempo (verifier.py) | 5 |
TIMEOUT | Timeout delle richieste HTTP | 25 (exploit) / 15 (verifier) |
MAX_RETRIES | Numero di tentativi per le richieste non riuscite | 2 |
exploit.py - Scansione approfondita
python3 exploit.py
Output atteso:
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.
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 di attacco Rete Privilegi richiesti Bassi Interazione utente None Punteggio EPSS
0.29% (probabilità di sfruttamento entro 30 giorni)
Mappatura CWE
CWE‑89: Neutralizzazione impropria di elementi speciali utilizzati in un comando SQL ('SQL Injection')
Perché il payload funziona
Il codice vulnerabile in 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
}
Esempio di payload dell'attaccante: