• 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}}
     

  • 相关阅读:
    PyTorch开发者福音, OpenVINO整合PyTorch实现推理加速!
    quarkus依赖注入之九:bean读写锁
    【rust/esp32】wsl2开发环境搭建与测试
    TUI界面容器管理工具Oxker
    数据结构四:线性表之带头结点的单向循环循环链表的设计
    flink 查看写入starrocks的数据量 总行数
    Vue - 虚拟DOM的简单理解
    使用Python PySNMP模块获取设备指标
    RSA中PCKS1, PSS and OAEP的区别
    减少延迟时间的方法
  • 原文地址:https://blog.csdn.net/qq_58970968/article/details/126255467