FreeMarker模板注入
FreeMarker
原理
FreeMarker模板语言(FTL)的4个组成部分:
- 文本:原样输出
- 插值:输出会被模板引擎计算得到的值替换
- FTL标签:与html标签类似,只是给FreeMarker的提示,不会打印在输出内容里
- 注释
利用
内建函数
利用FreeMarker的原生函数
new函数利用
new函数可以创建一个继承自freemarker.template.TemplateModel
类的实例,实例化可用的对象来执行命令
1 |
|
freemarker.template.utility.Execute#exec
执行命令
api函数利用
api函数可以用来访问Java API
通过getClassLoader获取类加载器,加载恶意类
1 |
|
getResource读取资源文件
1 |
|
防御措施
FreeMarker>2.3.22
api_builtin_enabled默认false,不能使用api内建函数
还提供了3个预定义的解析器限制new函数对类的访问
- UNRESTRICTED_RESOLVER:简单的调用ClassUtil.forName(String)
- SAFER_RESOLVER:禁止解析ObjectConstructor、Execute、freemarker.template.utility.JythonRuntime(上面三个执行命令的类)
- ALLOWS_NOTHING_RESOLVER:禁止解析任何类
CVE-2019-9614
漏洞概要
影响版本:OFCMS<1.1.3
FreeMarker版本:2.3.21
OFCMS使用FreeMarker作为模板引擎,后台提供了修改模板文件的功能,攻击者可利用FreeMarker模板注入的方式获取权限
漏洞复现
登录后台,在一个模板文件中插入payload,这里用contact.html
1 |
|
访问对应页面,触发模板解析,执行命令
1 |
|
漏洞分析
/ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/cms/TemplateController
save方法先获取模板文件路径,然后将未过滤的数据保存入模板文件,导致攻击者将可执行系统命令的代码存入FreeMarker模板
对应的模板文件目录
参考
https://www.cnblogs.com/Eleven-Liu/p/12747908.html
https://blog.csdn.net/Alexz__/article/details/116426132
http://lanbainan.cn/2020/05/20/2020-05-20/
https://blog.csdn.net/Alexz__/article/details/116400913
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!