
BOLA/IDOR vulnerability in osTicket ajax.tickets.php | Responsible Disclosure
ajax.tickets.phpBroken Object Level Authorization (BOLA): Insecure Direct Object Reference (IDOR)
include/ajax.tickets.php→viewField()function
Reported by @JF0x0r · March 27, 2026 Status: PATCHED - Fix released in osTicket v1.17.8 / v1.18.4
| Field | Details |
|---|---|
| Vulnerability | BOLA / IDOR (Broken Object Level Authorization) |
| Target | osTicket v1.18-git - commit 2570d69 |
| Component | include/ajax.tickets.php |
| Function | viewField() - lines 805–806 |
| Endpoint | GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view |
| CVSS 4.0 Score | 8.2 HIGH - AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N |
| CWE | CWE-862 (Missing Authorization), CWE-639 (Auth Bypass via User-Controlled Key) |
| Status | ✅ Patched — fixed in osTicket v1.17.8 and v1.18.4 |
I'm Juan Felipe Oz (@JF0x0r), a security researcher passionate about open source security. I don't do this for bounties i do it because i believe the tools people rely on should be safe. When I find something, I report it responsibly, document it properly, and share it publicly once it's fixed.
While doing a manual code review of osTicket's AJAX subsystem, I noticed something off in ajax.tickets.php. The viewField() function handles requests to view ticket field data - and it does retrieve the ticket object and validates the field exists. But it never checks whether the requesting agent actually has permission to access that ticket.
No checkStaffPerm(). No department validation. Nothing.
This means any authenticated agent, even one strictly limited to a single department can read ticket fields from any other department in the system, just by knowing or guessing the ticket_id and field_id. Those are sequential integers. Easy to enumerate.
What makes this particularly clear-cut is the comparison with editField(), the sister function right above it in the same file. editField() correctly calls $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) and returns HTTP 403 on violation. The fix was already implemented for writes — it was simply never applied to reads.
I recorded a full end-to-end demonstration of the exploit in a controlled lab environment:
The video walks through:
agent_a authenticated with access restricted to Dept-A onlyThe exploit.py script in this repository automates the full chain (authentication → enumeration → unauthorized field access) and was used during the assessment to confirm the issue scales beyond manual testing.
ticket_id / field_id integers make bulk scraping trivialA single line insertion in viewField(), immediately after the ticket object is retrieved - mirroring exactly what editField() already does correctly. Full technical details, diff, and CVSS breakdown are in the attached report.
📄 BOLA_IDOR_osTicket_Report_v2.pdf
osTicket confirmed the report and implemented the mitigation by adding $ticket->checkStaffPerm($thisstaff) before resolving/rendering the requested field - mirroring the check already present in editField(). Staff must now have access to the parent ticket before viewing field data.
osTicket recommends a short upgrade buffer before sharing full exploit steps publicly. This repo follows that guidance - see Disclosure Timeline below.
.
├── 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
I reported this privately to the osTicket security team before publishing anything. This repository was made public only after the responsible disclosure window, and now that an official patch has shipped, the full write-up is available. If you are an osTicket maintainer and have questions, feel free to reach out directly via GitHub.
Found by @JF0x0r · Open source security matters.
| Detail | Reference |
|---|
| Patch commit | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| Fixed in | v1.17.8 · v1.18.4 |
| Official downloads | osticket.com/download |
| Release type | Accelerated security release |
| Acknowledgement | Juan Felipe Oz (@JF0x0r) |
| Date | Event |
|---|
| March 27, 2026 | Vulnerability discovered and documented |
| March 27, 2026 | Report sent to [email protected] |
| June 17, 2026 | osTicket confirms the issue and shares mitigation patch for verification |
| June 17, 2026 | osTicket releases v1.17.8 and v1.18.4 containing the fix (commit d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | CVE assignment pending via GitHub CNA |