🔐 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
| 影响 | 描述 |
|---|---|
| 数据窃取 | 基于时间的盲注可提取敏感数据库内容 |
| 拒绝服务 | 重型查询可耗尽连接池资源 |
| 信息泄露 | 基于报错的技术可揭示数据库结构及数据 |
本工具包可自动检测数据库类型,并为 11 种不同的数据库后端 适配相应的利用技术:
本项目提供两个 Python 脚本,适用于不同的安全评估场景:
verifier.py – 安全且最小化的验证工具用途: 在不提取数据的情况下快速证明漏洞是否存在。
功能:
VULNERABLE 或 NOT VULNERABLE✅ 优势:
📋 使用场景: 用于判断目标是否存在漏洞的初步评估。
exploit.py – 综合性安全分析工具用途: 充分利用漏洞以提取数据库信息。
功能:
✅ 优势:
📋 使用场景: 在漏洞确认后进行深入的安全分析。
🔍 关键区别:
verifierPoC.py告诉您目标是否存在漏洞;exploit.py向您展示可以提取什么。两者在安全评估工作流中扮演不同但互补的角色。
requests 库pip install requests
请编辑两个脚本顶部的以下变量:
1️⃣ 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。
| 属性 | 详情 |
|---|
| 发现者 / 报告者 | Terence Monteiro(Apache Fineract 团队) |
| 公开披露日期 | 2026 年 7 月 14 日 |
| 修复版本 | Apache Fineract 1.15.0 |
| 官方公告 | Apache 邮件列表 |
| GitHub 修复 | PR #6048 |
| 数据库 | 检测方法 | 利用技术 |
|---|
| PostgreSQL | 基于时间(pg_sleep) | 基于时间的盲注 |
| MySQL | 基于时间(SLEEP) | 基于时间的盲注 |
| MariaDB | 基于时间 + @@version_comment | 基于时间的盲注 |
| MSSQL | 基于报错(CONVERT 失败) | 基于报错 |
| Oracle | 基于时间(DBMS_LOCK.SLEEP) | 基于时间的盲注 |
| SQLite | 重型查询(笛卡尔连接) | 基于时间(重型) |
| Firebird | 重型查询(笛卡尔连接) | 基于时间(重型) |
| DB2 | 重型查询(笛卡尔连接) | 基于时间(重型) |
| Informix | 重型查询(笛卡尔连接) | 基于时间(重型) |
| H2 | 重型查询(笛卡尔连接) | 基于时间(重型) |
| 未知(通用) | 回退到 PostgreSQL | 基于时间 |
| 变量 | 描述 | 默认值 |
|---|
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 |
| 措施 | 优先级 |
|---|
| 升级到 Apache Fineract 1.15.0+ | 🔴 严重 |
| 应用 PR #6048 补丁 | 🔴 严重 |
WAF 规则: 阻止 orderBy 中包含 (SELECT、SLEEP(、pg_sleep(、WAITFOR | 🟠 高 |
监控日志中带括号或子查询关键字的 orderBy | 🟠 高 |
| 数据库连接池监控以检测资源耗尽 | 🟡 中 |