避免java包'freemarker'执行命令

问题描述 投票:0回答:1

我使用 Apache Freemarker 作为我的模板引擎。

我有一个安全问题,我不确定如何处理: 管理员用户可以修改模板,但以防他们设置如下输入:

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

然后代码会调用:

freemarker.core.Environment.process()

命令“pwd”将被执行。

如何避免?

java freemarker
1个回答
1
投票

在我的用例中,我正在检索 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_enabled
保持为
false
(默认值),你会更安全 就像在doc中解释的那样。

这篇文章表明即使使用更严格的解析器

ALLOWS_NOTHING_RESOLVER
如果
api_builtin_enabled
设置为真,你仍然可以有漏洞。

© www.soinside.com 2019 - 2024. All rights reserved.