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/')
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)

有两处过滤第一处是将()小括号替换为空,意味着我们不能直接使用os模块了

第二处是过滤掉了config,和self两个关键字

`['{{% set {}=None%}}'.format(c) for c in blacklist]`这部分代码会遍历`blacklist`列表中的每个元素,将其插入到`{{% set {}=None%}}`字符串模板中的占位符`{}`处,生成对应的变量赋值语句

例如,如果`blacklist`列表包含`config`和`self`,那么生成的语句就是`{{% set config=None%}}`和`{{% set self=None%}}`。

那说明flag有很大几率存在于config的配置信息中

虽然上面提到的 config、self 不能使用,要获取配置信息,可以访问 配置current_app全局变量

shrine_第1张图片

得到flag

shrine_第2张图片

current_app

在Python中,`current_app`是Flask框架中的一个核心对象。它表示当前正在运行的Flask应用程序。在使用Flask开发Web应用程序时,可以通过`current_app`对象来访问应用程序的配置、上下文和其他重要的应用程序级别的功能。

访问配置:Flask应用的配置是存储在其`config`属性中的。我们可以通过`current_app.config`来访问当前应用的配置。例如,如果你在应用的配置中设置了一个`flag`,你可以通过`current_app.config['flag']`来访问它。

url_forget_flashed_messages两个函数中包含了current_app全局变量

你可能感兴趣的:(SSTI,安全)