1. Flask SSTI漏洞原理与基础利用
1.1 什么是SSTI漏洞
SSTI(Server-Side Template Injection)即服务端模板注入,是一种发生在Web应用模板渲染环节的安全漏洞。当开发者将用户输入直接拼接到模板字符串中时,攻击者可以通过注入模板语法来执行任意代码。
在Flask框架中,默认使用Jinja2作为模板引擎。Jinja2提供了丰富的模板语法,包括变量插值、控制结构等。当用户输入未经严格过滤就直接嵌入模板时,攻击者可以利用这些语法特性实现RCE(远程代码执行)。
1.2 漏洞代码分析
让我们先看一个典型的漏洞代码示例:
python复制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()
这段代码存在三个关键问题:
- 直接拼接用户输入到模板字符串
- 动态创建模板而非使用预定义模板文件
- 对name参数没有任何过滤或转义
1.3 基础利用方法
最简单的测试方法是传入模板表达式:
code复制?name={{7*7}}
如果页面返回"Hello 49",则确认存在SSTI漏洞。接下来可以尝试获取Python环境信息:
code复制?name={{''.__class__.__mro__[1].__subclasses__()}}
这个payload的工作原理是:
''.__class__获取字符串对象的类__mro__[1]获取object基类__subclasses__()列出所有子类
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高级利用技巧与RCE实现
2.1 绕过输出限制
在实际测试中,可能会遇到输出被截断的情况。如原始文章中提到的
