这次会以两个java项目例子讲解一下。首先是jeecgmboot。这个其实安恒团队文章写的很不错。
然后结合合天网安团队以及nice0e3大佬的博客也非常优秀,结合一起看关于freemarkerSSTI分析。大家可以直接跳末尾看他们的。我也只是略微集中整理一下二者。仅供我自己学习。文章可能有点长。。。
jeecgmboot SSTI
网上流传的vul url:/jeecg-boot/jmreport/queryFieldBySql.
poc:{"sql":"select 'result:<#assign value="freemarker.template.utility.Execute"?new()>${value("Calc")}' "}
拿到 jeecgmboot 源码【开源可搜到】,如果是自己独立分析首先是会搜索 url:queryFieldBySql,直接在 idea 中搜索。正常情况下是搜索不到什么的结果的。
因为 idea 一般无法搜索 jar 包里的内容。虽然它会直接显示反编译后 class 文件内容
这个时候你需要把源码以及 maven 导入的 Jar 包放到一起,然后使用 java 反编译工具去看完整的代码。我这里使用工具的是 jd-gui。
搜索 queryFieldBySql 其实会发现两处,但是结合完整的路由最后确定是在
org.jeecg.modules.jmreport.desreport.a 包的 a 类中
767 行到 807 都是在判断 没有到 sql 解析
771 行判断 i.a(string)这是过滤 sql 注入,对 sql 是否存在一些危险注入字符进行判断。可跳过,本次重点主要分析 SSTI 注入
785-800 都是 if 多个判断,需要多个&&为真就进入 if 内执行,因为我们 Payload 里都没有传入 dbsource paramarray.还有根据结果推断,这些 if 判断都为 false,没有满足。
800-811 根据我们 poc 返回结果,反推真正执行 SSTI 入口的代码在 811 行函数 parseReportSql
直接看 parseReportSql 函数
直接看690行f.a函数
这里才是真正产生漏洞危害的函数是:Template.process()。下面关于是 Freemarker 框架中
从freemarker.template.Template 函数 process到rce命令执行
process 函数是模板解析函数,同时解析结果是存在第二个参数当中。它自己内部会再调用一个 process 函数
然后process会调用 visit 函数,visit 函数其实从名字还有参数来看就是获取目标内容元素然后对他们进行处理
visit函数又会调用accept函数。因为它有很多很多函数重载,所以从这里开始有遗漏请见谅。
然后会调用calculateInterpolatedStringOrMarkup
然后会调用eval函数
然后调用MethodCall类中的_eval函数
即 object instanceof Object 左边是对象的实例,右边是类,用于判断 2 个类之间是否存在父子关系然后就是
targetMethod.exec(argumentStrings);
targetMethod就是我们的传入的类
argumentString就是我们传入的参数
exec 是一个继承了 TemplateModel 抽象接口的一个方法,是没有具体实现的函数内容,所以我们要去找 implements 该接口的类,才能看见具体实现方法内容。
我们目前发现了 :freemarker.template.utility.Execute,刚好它 exec 方法中还有一个命令执行函数
还有一个freemarker.template.utility.JythonRuntime。这个类也继承了TemplateModel
关于 为什么一定要继承TemplateModel.我觉得是因为
2
OFCMS SSTI
这个 cms 它有一个模板文件编辑功能,我们直接在模板文件中添加 poc 就可以,它也是使用了 Freemarker。
也是因为解析模板SSTI注入导致的,但是它的漏洞入口其实是在 jar 包中。因为我们保存了模板文件以后,没有从控制器里直接找到明显的模板解析相关的代码。
从web.xml过滤器中我发现了一点端倪。所有的路由都要经过com.jfinal.core.JFinalFilter这个过滤器,
init方法中它会进行freemarker 初始化,因为项目中可能有多个不同种类的模板,后续会根据模板种类不同来调用不同的模板类去解析
我猜测就是这样,因为这个jar包层层调用太多了而且函数的名字都一样,所以我就不继续分析了。
3
预防 SSTI 注入
在模板解析代码前,加入下面的代码
参考借鉴:
九维团队-绿队(改进)| jeecgboot SSTI(RCE)漏洞复现 (qq.com)
https://juejin.cn/post/7168736665677070366#heading-5
https://www.cnblogs.com/nice0e3/p/16217471.html
原文始发于微信公众号(天才少女Alpha):Freemarker SSTI注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论