避免Java包'freemarker'来执行命令

btxsgosb  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(179)

我使用Apache Freemarker作为模板引擎。
我有一个安全问题,我不知道如何处理:管理员用户可以修改模板,但如果他们将设置如下输入:

`<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("pwd")}`.

然后代码将调用:
freemarker.core.Environment.process()
命令“pwd”将被执行。
我该如何避免呢?

1aaf6o9v

1aaf6o9v1#

在我的用例中,我检索Freemarker模板并将模板与Java代码合并,如下所示:

String templateName = "Whatever from any variable"
    StringTemplateLoader stringLoader = new StringTemplateLoader();
    stringLoader.putTemplate(templateName, templateContent);
    Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
    cfg.setTemplateLoader(stringLoader);
    // Create Template class object & get the Template
    Template template = cfg.getTemplate(templateName);
    // Render the template into a Writer, here a StringWriter
    StringWriter writer = new StringWriter();
    // Merge the model & template
    template.process(dataModel, writer);

这里也受到了和OP一样的攻击
我的解决方案是按照注解中所说的那样设置SAFER_RESOLVER,但在模板示例中设置值,如下所示:

template.setSetting("new_builtin_class_resolver", "safer");

在我的代码中添加了这一行之后(就在模板示例化之后),我的代码是安全的。
非常重要的是要知道,即使你实现了这一点,如果你也像文档中解释的那样保持api_builtin_enabledfalse(默认值),你会更安全。
This article表明,即使使用更严格的解析器ALLOWS_NOTHING_RESOLVER,如果api_builtin_enabled设置为true,您仍然可能存在该漏洞。

相关问题