我使用 Apache Freemarker 作为我的模板引擎。
我有一个安全问题,我不确定如何处理: 管理员用户可以修改模板,但以防他们设置如下输入:
`<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("pwd")}`.
然后代码会调用:
freemarker.core.Environment.process()
命令“pwd”将被执行。
如何避免?
在我的用例中,我正在检索 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
设置为真,你仍然可以有漏洞。