tc4dy/CVE-2026-57821-PoC-Exploit
GitHub: tc4dy/CVE-2026-57821-PoC-Exploit
针对 Apache Fineract orderBy 参数 SQL 注入漏洞(CVE-2026-57821)的概念验证与利用工具包,提供无害验证和深度数据提取两种模式。
Stars: 1 | Forks: 0

# 🛡️ CVE-2026-57821 – Apache Fineract SQL 注入
## 📋 漏洞概述
**CVE-2026-57821** 是在 Apache Fineract 的 office 列表 API endpoint 中发现的一个 **SQL 注入**漏洞。
### 🎯 受影响组件
| 属性 | 详情 |
| :--- | :--- |
| **Endpoint** | `/api/v1/offices` |
| **Parameter** | `orderBy` |
| **Method** | `GET` |
| **Authentication Required** | 是(仅限已认证用户) |
| **Affected Versions** | Apache Fineract ≤ 1.14.0 |
| **Patched Version** | Apache Fineract 1.15.0 |
### 🧠 漏洞原理
该漏洞的存在是因为 `orderBy` 参数在未经适当清理的情况下被直接嵌入到 SQL 查询中。拥有有效凭证的攻击者可以将包含在括号 `()` 中的 **subqueries** 注入到 `orderBy` 参数中。
**为什么这能绕过之前的修复:**
- CVE-2024-32838 引入了一个 `ColumnValidator` 来清理 `ORDER BY` 子句
- 该验证器无法检测到括号内的 **bare subqueries**
- 这允许在 `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 Team) |
| **公开披露日期** | 2026 年 7 月 14 日 |
| **Patched Version** | Apache Fineract 1.15.0 |
| **官方公告** | [Apache 邮件列表](https://lists.apache.org/thread/lb7zwdv7qntzy6z05gzf7m8mxw9cbgsj) |
| **GitHub 修复** | [PR #6048](https://github.com/apache/fineract/pull/6048) |
## 🗄️ 支持的数据库系统
该工具包会自动检测并适配针对 **11 种不同数据库后端**的利用技术:
| 数据库 | 检测方法 | 利用技术 |
| :--- | :--- | :--- |
| **PostgreSQL** | 基于时间 (`pg_sleep`) | 基于时间的盲注 |
| **MySQL** | 基于时间 (`SLEEP`) | 基于时间的盲注 |
| **MariaDB** | 基于时间 + `@@version_comment` | 基于时间的盲注 |
| **MSSQL** | 基于报错 (`CONVERT` 失败) | 基于报错 |
| **Oracle** | 基于时间 (`DBMS_LOCK.SLEEP`) | 基于时间的盲注 |
| **SQLite** | 繁重查询 (Cartesian Join) | 基于时间 (繁重) |
| **Firebird** | 繁重查询 (Cartesian Join) | 基于时间 (繁重) |
| **DB2** | 繁重查询 (Cartesian Join) | 基于时间 (繁重) |
| **Informix** | 繁重查询 (Cartesian Join) | 基于时间 (繁重) |
| **H2** | 繁重查询 (Cartesian Join) | 基于时间 (繁重) |
| **未知 (通用)** | 回退到 PostgreSQL | 基于时间 |
## 🛠️ 工具包组件
本项目提供了 **两个 Python 脚本**,用于不同的安全评估场景:
### 📊 `verifier.py` – 安全且最小化的验证工具
**目的:** 在不提取数据的情况下快速证明漏洞的存在。
**功能:**
- 发送特定于数据库的测试 payload
- 检测时间延迟或错误消息
- 针对每种数据库类型报告 `VULNERABLE` 或 `NOT VULNERABLE`
- **不窃取任何数据**
**✅ 优点:**
- 极速(几秒钟内完成)
- 法律风险低(仅验证是否存在)
- 非常适合初步安全扫描
- 适合合规性的报告输出
**📋 使用场景:** 用于确定目标是否存在漏洞的首次评估。
### 🔬 `exploit.py` – 全面的安全分析器
**目的:** 全面利用该漏洞来提取数据库信息。
**功能:**
- 自动检测数据库类型
- 使用 **二分搜索** 逐个字符提取
- 检索:**版本、当前用户、数据库名称、表列表**(可配置)
- MSSQL:基于报错的提取
- 其他:基于时间的提取,带有基线校准
**✅ 优点:**
- 提供影响的 concrete evidence
- 展示漏洞的全部范围
- 详细的日志记录,带有颜色编码的输出
**📋 使用场景:** 确认漏洞后的深入安全分析。
## ⚙️ 安装与配置
### 前置条件
- Python 3.6+
- `requests` 库
```
pip install requests
```
## ⚙️ 配置变量
编辑两个脚本顶部的以下变量:
| 变量 | 描述 | 默认值 |
| :--- | :--- | :--- |
| `TARGET` | Fineract API URL | `http://localhost:8080/fineract-provider/api/v1/offices` |
| `USERNAME` | API authentication 用户名 | `mifos` |
| `PASSWORD` | API authentication 密码 | `password` |
| `TENANT_ID` | 租户标识符 | `default` |
| `BASE_SLEEP` | 基于时间测试的休眠时间 (exploit.py) | `6` |
| `SLEEP_SECONDS` | 基于时间测试的休眠时间 (verifier.py) | `5` |
| `TIMEOUT` | HTTP 请求超时 | `25` (exploit) / `15` (verifier) |
| `MAX_RETRIES` | 失败请求的重试次数 | `2` |
# 🚀 使用指南
1️⃣ verifier.py – 快速扫描
```
python3 verifier.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% (probability of exploitation within 30 days)
```
CWE 映射
```
CWE‑89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
```
# 🧪 技术深度剖析
Payload 为何有效
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
}
```
攻击者 Payload 示例:
```
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 检查了列名,但漏掉了嵌套的 subquery,从而允许执行任意 SQL。
## 🛡️ 缓解措施
| 行动 | 优先级 |
| :--- | :--- |
| **升级到 Apache Fineract 1.15.0+** | 🔴 关键 |
| **应用 PR #6048 补丁** | 🔴 关键 |
| **WAF 规则:** 阻止包含 `(SELECT`, `SLEEP(`, `pg_sleep(`, `WAITFOR` 的 `orderBy` | 🟠 高 |
| **监控日志**中带有括号或 subquery 关键字的 `orderBy` | 🟠 高 |
| **数据库连接池监控** 以检测资源耗尽 | 🟡 中 |
标签:CISA项目, Python, 安全测试, 攻击性安全, 无后门, 逆向工具