• 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

     

    1. from flask import Flask, url_for
    2. app = Flask(__name__)
    3. app.config.update(DEBUG=True)
    4. @app.route('/')
    5. def demo1():
    6. print(url_for("book")) # 注意这个引用的是视图函数的名字 字符串格式
    7. print(type(url_for("book")))
    8. return url_for("book")
    9. @app.route('/book_list/')
    10. def book():
    11. return 'flask_book'
    12. if __name__ == "__main__":
    13. app.run()

    执行结果;

    他会返回他的地址;

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

     题目代码:
     

    1. import flask
    2. import os
    3. app = flask.Flask(__name__)
    4. app.config['FLAG'] = os.environ.pop('FLAG')
    5. @app.route('/')
    6. def index():
    7. return open(__file__).read()
    8. @app.route('/shrine/')
    9. def shrine(shrine):
    10. def safe_jinja(s):
    11. s = s.replace('(', '').replace(')', '')
    12. blacklist = ['config', 'self']
    13. return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist])
    14. + s
    15. return flask.render_template_string(safe_jinja(shrine))
    16. if __name__ == '__main__':
    17. 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_

     

    看到爆出 ‘current_app’

    继续爆config 

    url_for._globals_[‘current_app’].config

     

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

    同样的操作:

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

  • 相关阅读:
    DefaultListableBeanFactory接口总结
    测试人员Bug书写规范
    怎么压缩图片不影响清晰度
    12种绝佳买入形态k线图(下)
    基于深度学习YOLOv8\YOLOv5的花卉识别鲜花识别检测分类系统设计
    记录第一次
    imitation learning
    java 中使用 protobuf 对WebSocket 数据推送解析
    1.4.14 实验14:ospf多区域
    第2章-数据处理-2.1-使用pandas读取结构化数据
  • 原文地址:https://blog.csdn.net/qq_58970968/article/details/126255467