zoukankan      html  css  js  c++  java
  • [WesternCTF2018]shrine

    又是SSTI模板注入类题目
    源代码如下:

    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)
    

    代码中给出了两个路由,第一个是用来显示源代码的

    第二个路由在/shrine/路径下提交参数,模板中设定{{ }}包括的内容为后端变量,% %包括的内容为逻辑语句

    简单测试


    在没有黑名单过滤的情况下

    我们可以使用config,传入 config,或者使用self传入 {{self.dict}}

    当config,self,()都被过滤的时候,为了获取讯息,我们需要读取一些例如current_app这样的全局变量。python的沙箱逃逸这里的方法是利用python对象之间的引用关系来调用被禁用的函数对象。

    这里有两个函数包含了current_app全局变量,url_for和get_flashed_messages

    我们注入{url_for.globals}得到


    继续注入当前app的config

    {url_for.globals['current_app'].config}得到

  • 相关阅读:
    爱的火花
    为你祝福
    你有成功的强烈愿望吗?人格魅力应该是这样修养而成的
    爱已远走
    我要跳舞
    创业家比商业模式更重要
    月下独酌
    李珊(再帮别人名字作诗)
    分析MSSQL数据库的用户表数和记录数 (转载)
    几个常用的SharePoint对象模型的有用函数
  • 原文地址:https://www.cnblogs.com/buchuo/p/12696854.html
Copyright © 2011-2022 走看看