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

  • 相关阅读:
    『参考』.net CF组件编程(3)——在移动设备项目中使用组件
    『原创』+『参考』PPC丢失后,手机信息如何保护?(C#)
    索引贴——移动开发(.Net CF 停止更新)
    NavReady 试用小记(1)
    第一次做webcast
    Webcast预告
    恼人的"don't know how to make"错误
    在这里开博了
    针对导航产品,微软推出NavReady 2009
    NavReady的使用
  • 原文地址:https://www.cnblogs.com/luocodes/p/13830643.html
Copyright © 2011-2022 走看看