Sploitus

Exploit for CVE-2026-14871

kitploit · 2026-09-05

Exploit Code

MARKDOWN112 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-JFOZ1010-CVE-2026-14871
# CVE-2026-14871 - osTicket `ajax.tickets.php` 中的 BOLA / IDOR 漏洞

> **对象级授权失效 (BOLA):不安全的直接对象引用 (IDOR)**  
>  `include/ajax.tickets.php` → `viewField()` 函数  
>  由 @JF0x0r 报告 · 2026年3月27日 **状态:已修复 - 修复已在 osTicket v1.17.8 / v1.18.4 中发布**

* * *

## 一览

字段| 详情  
---|---  
**漏洞类型**|  BOLA / IDOR(对象级授权失效)  
**目标**|  osTicket v1.18-git - 提交 `2570d69`  
**组件**| `include/ajax.tickets.php`  
**函数**| `viewField()` \- 第 805–806 行  
**端点**| `GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view`  
**CVSS 4.0 评分**| **8.2 高危** \- `AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N`  
**CWE**|  CWE-862(缺失授权)、CWE-639(通过用户控制的密钥绕过授权)  
**状态**|  ✅ **已修补** — 已在 osTicket v1.17.8 和 v1.18.4 中修复  
  
* * *

## 关于我

我是 Juan Felipe Oz(@JF0x0r),一名热衷于开源安全的安全研究员。我这样做不是为了赏金,而是因为我坚信人们所依赖的工具应该是安全的。当我发现问题时,我会负责任地报告、妥善记录,并在修复后公之于众。

* * *

## 我发现了什么

在对 osTicket 的 AJAX 子系统进行手动代码审查时,我注意到 `ajax.tickets.php` 中有些不对劲。`viewField()` 函数处理查看工单字段数据的请求——它确实会检索工单对象并验证字段是否存在。但它**从不检查发出请求的客服人员是否真的有权限访问该工单** 。

没有 `checkStaffPerm()`。没有部门验证。什么都没有。

这意味着任何已认证的客服人员,即使是严格限制在单个部门的客服人员,也可以读取系统中**任何其他部门** 的工单字段,只需知道或猜测 `ticket_id` 和 `field_id` 即可。这些是连续的整数,很容易枚举。

更让这个问题一目了然的是与 `editField()` 的对比——它是同一文件中紧挨在上方的姊妹函数。`editField()` 正确调用了 `$ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT)`,并在违规时返回 HTTP 403。写入操作的修复早已实现——只是从未应用到读取操作上。

* * *

## 概念验证:实况演示

我在受控的实验室环境中录制了一段完整的端到端漏洞利用演示:

![PoC Video — BOLA/IDOR osTicket](https://img.shields.io/badge/%E2%96%B6%20Watch%20PoC-Google%20Drive-blue?style=for-the-badge&logo=google-drive)

视频演示了以下过程:

  * 搭建包含两个相互隔离部门的实验室环境(Dept-A 和 Dept-B)
  * 客服人员 `agent_a` 已完成认证,访问权限仅限于 Dept-A
  * 构造针对 Dept-B 机密工单的未授权请求
  * 服务器返回 **HTTP 200** ,受限工单字段数据遭到泄露
  * 修补后重放,显示 **HTTP 403 — 权限被拒绝**



本仓库中的 `exploit.py` 脚本自动化了整个攻击链(认证 → 枚举 → 未授权字段访问),在评估期间用于确认该问题的影响范围远超手动测试。

* * *

## 影响

  * **敏感数据泄露** \- 任何客服人员都可以跨所有部门读取机密工单字段
  * **水平权限提升** \- 部门边界被完全绕过
  * **批量枚举** \- 连续的 `ticket_id` / `field_id` 整数使批量抓取变得轻而易举
  * **多租户机密性破坏** \- 彻底违背了 osTicket 部门隔离模型的核心设计原则



* * *

## 修复方案

在 `viewField()` 中插入一行代码,紧接在检索到工单对象之后——与 `editField()` 已经正确执行的操作完全一致。完整的技术细节、diff 和 CVSS 分解见随附的报告。

📄 `BOLA_IDOR_osTicket_Report_v2.pdf`

### ✅ 官方补丁(osTicket 团队已确认)

osTicket 确认了该报告,并通过在解析/渲染所请求的字段之前添加 `$ticket->checkStaffPerm($thisstaff)` 实施了缓解措施——与 `editField()` 中已有的检查保持一致。现在,员工必须先拥有对父工单的访问权限,才能查看字段数据。

> osTicket 建议在公开分享完整漏洞利用步骤之前留出短暂的升级缓冲期。本仓库遵循该建议——请参阅下方的披露时间线。

* * *

## 披露时间线

* * *

## 本仓库中的文件

root@kitploit:~
    
    
    .
    ├── README.md                        # This file
    ├── BOLA_IDOR_osTicket_Report_v2.pdf # Full technical disclosure report
    ├── exploit.py                       # PoC automation script
    └── PoC_osTicket.mov                 # Local copy of the demo video
    

* * *

## 负责任披露

我在发布任何内容之前,已私下向 osTicket 安全团队报告了此问题。本仓库仅在负责任披露期结束后才公开,现在官方补丁已发布,完整的技术报告可供查阅。如果您是 osTicket 维护者并有疑问,欢迎直接通过 GitHub 联系。

* * *

由 @JF0x0r 发现 · 开源安全至关重要。