
🔐 CVE-2026-57821 - Apache Fineract SQL Injection Toolkit 📚 Dos scripts de Python para pruebas de seguridad autorizadas: verifier.py (detección segura, sin extracción) y exploit.py (análisis profundo). Soporta 11 tipos de DB. Perfecto para comprender las vulnerabilidades de inyección SQL. Solo pruebas legales ⚠️ exclusivamente con fines educativos y de investigación.

⚠️ AVISO LEGAL Y ÉTICO
Este toolkit se proporciona estrictamente para fines educativos, de formación y de pruebas de seguridad autorizadas.
El uso no autorizado contra cualquier sistema sin permiso escrito explícito es ilegal y viola las leyes de delitos informáticos.
El autor no asume ninguna responsabilidad por el mal uso o los daños.
Usted es el único responsable de sus acciones.
CVE-2026-57821 es una vulnerabilidad de inyección SQL descubierta en el endpoint de listado de oficinas de Apache Fineract.
| Atributo | Detalle |
|---|---|
| Endpoint | /api/v1/offices |
| Parámetro | orderBy |
| Método | GET |
| Autenticación requerida | Sí (solo usuarios autenticados) |
| Versiones afectadas | Apache Fineract ≤ 1.14.0 |
| Versión parcheada | Apache Fineract 1.15.0 |
La vulnerabilidad existe porque el parámetro orderBy se incrusta directamente en las consultas SQL sin una sanitización adecuada. Un atacante con credenciales válidas puede inyectar subconsultas envueltas en paréntesis () en el parámetro orderBy.
Por qué esto evade los parches anteriores:
ColumnValidator para sanitizar las cláusulas ORDER BYORDER BYEjemplo de Vector de Ataque:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
| Impacto | Descripción |
|---|---|
| Exfiltración de datos | La inyección SQL ciega basada en tiempo puede extraer contenido sensible de la base de datos |
| Denegación de servicio | Las consultas pesadas pueden agotar los recursos del pool de conexiones |
Este toolkit detecta automáticamente y adapta las técnicas de explotación para 11 motores de base de datos diferentes:
Este proyecto proporciona dos scripts de Python para diferentes escenarios de evaluación de seguridad:
verifier.py – Herramienta de Verificación Segura y MínimaPropósito: Demostrar rápidamente la existencia de la vulnerabilidad sin extraer datos.
Qué hace:
VULNERABLE o NOT VULNERABLE para cada tipo de base de datos✅ Ventajas:
📋 Caso de uso: Evaluación inicial para determinar si el objetivo es vulnerable.
exploit.py – Analizador de Seguridad IntegralPropósito: Explotar completamente la vulnerabilidad para extraer información de la base de datos.
Qué hace:
✅ Ventajas:
📋 Caso de uso: Análisis de seguridad en profundidad tras la confirmación de la vulnerabilidad.
🔍 Diferencia clave:
verifierPoC.pyte dice si es vulnerable;exploit.pyte muestra qué se puede extraer. Ambos cumplen funciones distintas pero complementarias en un flujo de trabajo de evaluación de seguridad.
requestspip install requests
Edite las siguientes variables al comienzo de ambos scripts:
1️⃣ exploit.py - Escaneo Profundo
python3 exploit.py
Salida Esperada:
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.
CVSS Score Metric Value CVSS v3.1 Base Score 8.1 (Alta) Vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H Attack Vector Red Privileges Required Bajo User Interaction Ninguna
EPSS Score
0.29% (probabilidad de explotación en 30 días)
CWE Mapping
CWE‑89: Neutralización incorrecta de elementos especiales utilizados en un comando SQL ('Inyección SQL')
Por Qué Funciona el Payload
El código vulnerable en 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
}
Ejemplo de Payload del Atacante:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
SQL Resultante:
SELECT * FROM offices ORDER BY (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)
El ColumnValidator comprueba los nombres de columna, pero no detecta la subconsulta anidada, lo que permite la ejecución arbitraria de SQL.
| Divulgación de información |
| Las técnicas basadas en errores pueden revelar la estructura y los datos de la base de datos |
| Atributo | Detalle |
|---|
| Descubridor / Informante | Terence Monteiro (Apache Fineract Team) |
| Fecha de divulgación pública | 14 de julio de 2026 |
| Versión parcheada | Apache Fineract 1.15.0 |
| Anuncio oficial | Lista de correo de Apache |
| Corrección en GitHub | PR #6048 |
| Base de datos | Método de detección | Técnica de explotación |
|---|
| PostgreSQL | Basada en tiempo (pg_sleep) | Ciega basada en tiempo |
| MySQL | Basada en tiempo (SLEEP) | Ciega basada en tiempo |
| MariaDB | Basada en tiempo + @@version_comment | Ciega basada en tiempo |
| MSSQL | Basada en errores (fallo de CONVERT) | Basada en errores |
| Oracle | Basada en tiempo (DBMS_LOCK.SLEEP) | Ciega basada en tiempo |
| SQLite | Consulta pesada (unión cartesiana) | Basada en tiempo (pesada) |
| Firebird | Consulta pesada (unión cartesiana) | Basada en tiempo (pesada) |
| DB2 | Consulta pesada (unión cartesiana) | Basada en tiempo (pesada) |
| Informix | Consulta pesada (unión cartesiana) | Basada en tiempo (pesada) |
| H2 | Consulta pesada (unión cartesiana) | Basada en tiempo (pesada) |
| Desconocida (genérica) | Repliegue a PostgreSQL | Basada en tiempo |
| Variable | Descripción | Valor predeterminado |
|---|
TARGET | URL de la API de Fineract | http://localhost:8080/fineract-provider/api/v1/offices |
USERNAME | Nombre de usuario de autenticación de la API | mifos |
PASSWORD | Contraseña de autenticación de la API | password |
TENANT_ID | Identificador de inquilino (tenant) | default |
BASE_SLEEP | Duración de la espera para pruebas basadas en tiempo (exploit.py) | 6 |
SLEEP_SECONDS | Duración de la espera para pruebas basadas en tiempo (verifier.py) | 5 |
TIMEOUT | Tiempo de espera de la solicitud HTTP | 25 (exploit) / 15 (verifier) |
MAX_RETRIES | Número de reintentos para solicitudes fallidas | 2 |
| Acción | Prioridad |
|---|
| Actualizar a Apache Fineract 1.15.0+ | 🔴 Crítica |
| Aplicar el parche del PR #6048 | 🔴 Crítica |
Regla WAF: Bloquear orderBy que contenga (SELECT, SLEEP(, pg_sleep(, WAITFOR | 🟠 Alta |
Monitorear los registros en busca de orderBy con paréntesis o palabras clave de subconsultas | 🟠 Alta |
| Monitoreo del pool de conexiones de la base de datos para detectar agotamiento de recursos | 🟡 Media |