Python flask渲染模板注入

2018-TokyoWesterns-Web-shrine

参考链接:

https://blog.csdn.net/Onlyone_1314/article/details/121875761

import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
#Flask提供了很多种方式来加载配置。比如,你可以像在字典中添加一个键值对一样来
#设置一个配置:app.config[‘FLAG’]就是当前app下一个变量名为’FLAG’的配置,
#它的值等于os.environ.pop(‘FLAG’)移除环境变量中的键名为’FLAG’的值。

@app.route('/')
def index():   #访问http://ip/,
    return open(__file__).read() #则执行index()函数打开当前文件,读取文件内容,返回文件源码

#访问http://ip/shrine/,则调用flask.render_template_string函数
#返回渲染模板字符串safe_jinja(shrine)

@app.route('/shrine/') 
def shrine(shrine):
    def safe_jinja(s):
        s = s.replace('(', '').replace(')', '') #先去掉s字符串变量中的“(”和“)”左右括号
        blacklist = ['config', 'self']
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s  # 过滤掉config, self 关键字
    return flask.render_template_string(safe_jinja(shrine)) #渲染模板

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

存在模板注入
在这里插入图片描述
过滤了括号和关键字,所以带括号的魔法函数都不能使用
在这里插入图片描述
config和self都为空
在这里插入图片描述
在这里插入图片描述

我们在这道题中的目的是读取配置文件中变量名为’FLAG’的值,也就是环境变量中的键名为’FLAG’的值,但是config、self参数的值设为None,无法直接查看

url_for()函数查看flag
我们可以使用flask框架的url_for函数:from flask import url_for。
url_for()作用:
(1)给指定的函数构造 URL。
(2)访问静态文件(CSS、JavaScript等)。只要在你的包中或是模块的所在目录中创建一个名为static的文件夹,在应用中使用 /static即可访问。
所以我们可以用url_for函数来查看当前包中所有的静态文件,其中肯定就包括了配置文件。
先查看url_for函数的全局变量的字典的引用:
在这里插入图片描述
其中’current_app’: <Flask ‘app’>键值对,current_app意思应该是当前app,那么我们直接查看app.config[‘FLAG’]
在这里插入图片描述

get_flashed_messages()函数查看flag

返回之前在Flask中通过flash()函数传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages()方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。
  flask闪现是基于flask内置的session的,利用浏览器的session缓存闪现信息。之前的每次flash()函数都会缓存一个信息,之后再通过get_flashed_messages()函数访问缓存的信息。
  flash()函数有三种形式缓存数据:
(1)缓存字符串内容。
设置闪现内容:flash(‘恭喜您登录成功’)
模板取出闪现内容:{% with messages = get_flashed_messages() %}
(2)缓存默认键值对。当闪现一个消息时,是可以提供一个分类的。未指定分类时默认的分类为 ‘message’ 。
设置闪现内容:flash(‘恭喜您登录成功’,“status”)
模板取出闪现内容:{% with messages = get_flashed_messages(with_categories=true) %}
(3)缓存自定义键值对。
设置闪现内容:flash(‘您的账户名为admin’,“username”)
模板取出闪现内容:{% with messages = get_flashed_messages(category_filter=[“username”])
所以我们可以通过get_flashed_messages()来获取所有缓存的闪现内容:
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值