🔐 CVE-2026-57821 - Apache Fineract SQL 注入工具包 📚 两个用于授权安全测试的 Python 脚本:verifier.py(安全检测,无数据提取)和 exploit.py(深度分析)。支持 11 种数据库类型。非常适合理解 SQL 注入漏洞。仅限合法测试 ⚠️ 仅供教育与研究用途。

法律与道德声明
本工具包严格仅供教育、培训及经授权的安全测试用途提供。
未经明确书面许可对任何系统进行未授权使用均属违法行为,并违反计算机犯罪相关法律。
作者对滥用或损害不承担任何责任。
您须对自己的行为承担全部责任。
CVE-2026-57821 是在 Apache Fineract 的办公室列表 API 端点中发现的 SQL 注入漏洞。
| 属性 | 详情 |
|---|---|
| 端点 | /api/v1/offices |
| 参数 | orderBy |
| 方法 | GET |
| 是否需要认证 | 是(仅限已认证用户) |
| 受影响版本 | Apache Fineract ≤ 1.14.0 |
| 修复版本 | Apache Fineract 1.15.0 |
该漏洞存在的原因是 orderBy 参数被直接嵌入 SQL 查询中,未经过适当的清理。拥有有效凭据的攻击者可以将包裹在括号 () 中的子查询注入到 orderBy 参数中。
为何此漏洞可绕过先前的修复:
ColumnValidator 来清理 ORDER BY 子句ORDER BY 上下文中可执行任意 SQL攻击向量示例:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
| 影响 | 描述 |
|---|---|
| 数据窃取 | 基于时间的盲 SQL 注入可提取敏感数据库内容 |
| 拒绝服务 | 重型查询可耗尽连接池资源 |
| 信息泄露 | 基于错误的技术可揭示数据库结构和数据 |
| 属性 | 详情 |
|---|---|
| 发现者 / 报告者 | Terence Monteiro(Apache Fineract 团队) |
| 公开披露日期 | 2026 年 7 月 14 日 |
| 修复版本 | Apache Fineract 1.15.0 |
| 官方公告 | Apache 邮件列表 |
| GitHub 修复 | PR #6048 |
本工具包可自动检测并适配 11 种不同数据库后端的利用技术:
| 数据库 | 检测方法 | 利用技术 |
|---|---|---|
| PostgreSQL | 基于时间(pg_sleep) | 基于时间的盲注 |
| MySQL | 基于时间(SLEEP) | 基于时间的盲注 |
| MariaDB | 基于时间 + @@version_comment | 基于时间的盲注 |
| MSSQL | 基于错误(CONVERT 失败) | 基于错误的注入 |
| Oracle | 基于时间(DBMS_LOCK.SLEEP) | 基于时间的盲注 |
| SQLite | 重型查询(笛卡尔连接) | 基于时间(重型) |
| Firebird | 重型查询(笛卡尔连接) | 基于时间(重型) |
| DB2 | 重型查询(笛卡尔连接) | 基于时间(重型) |
| Informix | 重型查询(笛卡尔连接) | 基于时间(重型) |
| H2 | 重型查询(笛卡尔连接) | 基于时间(重型) |
| 未知(通用) | 回退至 PostgreSQL | 基于时间 |
本项目提供两个 Python 脚本,用于不同的安全评估场景:
verifier.py – 安全且精简的验证工具用途: 在不提取数据的情况下快速证明漏洞存在。
功能:
VULNERABLE 或 NOT VULNERABLE优势:
使用场景: 用于确定目标是否存在漏洞的初步评估。
exploit.py – 综合安全分析器用途: 全面利用该漏洞以提取数据库信息。
功能:
优势:
使用场景: 在确认漏洞后进行深入的安全分析。
关键区别:
verifierPoC.py告诉你是否存在漏洞;exploit.py向你展示可以提取什么。两者在安全评估工作流中扮演不同但互补的角色。
requests 库pip install requests
在两个脚本的顶部编辑以下变量:
| 变量 | 描述 | 默认值 |
|---|---|---|
TARGET | Fineract API URL | http://localhost:8080/fineract-provider/api/v1/offices |
USERNAME | API 认证用户名 | mifos |
PASSWORD | API 认证密码 | password |
TENANT_ID | 租户标识符 | default |
BASE_SLEEP | 基于时间的测试的休眠时长(exploit.py) | 6 |
SLEEP_SECONDS | 基于时间的测试的休眠时长(verifier.py) | 5 |
TIMEOUT | HTTP 请求超时 | 25(exploit)/ 15(verifier) |
MAX_RETRIES | 失败请求的重试次数 | 2 |
exploit.py - 深度扫描
python3 exploit.py
预期输出:
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 评分 指标 值 CVSS v3.1 基础评分 8.1(高) 向量 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H 攻击向量 网络 所需权限 低 用户交互 无 EPSS 评分
0.29%(30 天内被利用的概率)
CWE 映射
CWE‑89:SQL 命令中使用的特殊元素的不当中和(“SQL 注入”)
载荷为何有效
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
}
攻击载荷示例:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
生成的 SQL:
SELECT * FROM offices ORDER BY (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)
ColumnValidator 会检查列名,但遗漏了嵌套子查询,从而允许任意 SQL 执行。
| 操作 | 优先级 |
|---|---|
| 升级到 Apache Fineract 1.15.0+ | 严重 |
| 应用 PR #6048 补丁 | 严重 |
WAF 规则: 阻止包含 (SELECT、SLEEP(、pg_sleep(、WAITFOR 的 orderBy | 高 |
监控日志,查找带有括号或子查询关键字的 orderBy | 高 |
| 数据库连接池监控,以检测资源耗尽 | 中 |