跳转至

[DSBCTF 2024]ezzz_ssti

题目地址:https://ctf.show/challenges#ezzz_ssti-4495

这题是一道标准的 flask ssti, 参数为 get user。传入 {{7*'7'}} 可验证,并检验得到没有过滤。但是发现了一个问题,就是有长度限制 40 位。即使我们使用比较短的 lipsum.__globals__.os.popen('ls').read() 也过不了。

这题当时没做出来,搜索资料也没搜到。但是其实只要搜 "ssti 长度限制" 就可以了。原理是这样的:首先 config 作为 flask 的一个字典变量,存储了一些 flask 运行的配置。但是在单次运行的 flask 实例中,config 是可保存的,所以可以把我们的信息存储在这里,利用 config.update() 方法即可。

因此,首先我们先把 update() 方法写入 config 中,用来省几个字符:

{{config.update(a=config.update)}}

然后我们可以通过 {{config}} 来查看有没有写入成功。这里是可以看到写入成功了的。所以我们就利用 config.a 来更新 config 字典。我们把之前的 payload 拆解一下写入变量就行,先把 os 模块获得:

{{config.a(b=lipsum.__globals__.os)}}

然后,我们就可以执行 popen 了:

{{config.b.popen('cat /flag').read()}}

文章热度:0次阅读