其他分享
首页 > 其他分享> > [WesternCTF2018]shrine

[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}}  

标签:__,jinja,app,WesternCTF2018,FLAG,shrine,config
来源: https://www.cnblogs.com/1jzz/p/14322572.html