打开网页给出了源代码
首先肯定是格式化一下
这里是个超时函数(不重要)
第一行创建 FastAPI 应用实例
第二行控制对 Jinja2 模板渲染的访问
后面将当前路径的目录作为 Jinja2 模板的目录
第一个 "/" 路由没什么好说的
首先是检查 calc_req 是否包含数字、百分号、非 ASCII 字符
或者 access 是否已经被设置为 True
如果安全检查通过
这行代码将使用 Jinja2 模板引擎渲染 calc_req 参数
jinja2.Environment(loader=jinja2.BaseLoader()):创建一个新的Jinja2环境
from_string():将 calc_req 作为模板字符串进行渲染
四个 { } 用于转义大括号使其不被解释为模板变量
构造 Payload 首先是 GET 请求:/calc?calc_req=
config.__init__.__globals__['__builtins__']['exec']()
config 对象包含了模板环境的配置
__init__ 是一个包含模板环境全局变量的属性
__globals__ 字典包含了全局变量
攻击者通过访问 __builtins__ 字典中的 exec 函数
用于执行字符串形式的 Python 代码
'app.add_api_route("/flag",lambda:__import__("os").popen("cat /flag").read());'
app.add_api_route("/flag", lambda: ...) 添加一个新的路由 /flag