进入题目
发现一串源代码,但是不规则,所以我们ctrl+u查看源代码
这样就整理好了代码,接下来就是审计代码了。我们来看看这个代码都写了啥。
首先导入了两个模块,一个flask,一个os。
然后用app.route装饰器传了两个路径
那我们访问一下这个路径
发现shrine后面的内容会被显示到浏览器上,那我我们可以试试是否存在模板注入构造payload
/shrine/{{2*2}}
发现进行了运算,那么可以判断这里是存在SSTI的。关于SSTI模板注入前面也碰到了不少题目,给大家放几个模板注入题目的链接,大家可以参考一下。
https://blog.csdn.net/xj28555/article/details/107347562
https://blog.csdn.net/xj28555/article/details/107182387
注入格式payload为
{{''.__class__.__mro__[2].__subclasses__()}}
但是仔细分析源代码会发现这里过滤了()和把'config','self'加入了黑名单
那么我们原来格式的模板注入就不能用了,这个时候我们想到了内置函数get_flashed_messages(),又应为config在current_app里面,所以我们可以构造payload
{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
这样就可以绕过